首页 > 编程语言 >qt图像算法—图像的种子算法之c++实现(不调包)

qt图像算法—图像的种子算法之c++实现(不调包)

时间:2024-10-20 15:19:35浏览次数:10  
标签:int image 调包 像素 算法 图像 y1 x1

 1.基本原理

    相互连通且颜色相近的像素集合可以被看成图像的区域,而区域填充就是将每一块图像区域用指定颜色填充,填充的算法有很多种,但今天的猪脚是种子算法。在使用种子算法的时候,我们要注意两点,第一点:连通像素的搜索分为四方向和八方向,根据应用自己选择就行;第二点:边界判断,如果填充过程遇到某点的像素值和基准像素值差距太大,就可以视该点位边界像素。

    种子算法的实现过程:

    1)选取一个起始种子点,获取基准颜色,将种子点压入栈

    2)从栈中取一个像素,依次对该像素的左右连通像素进行填充,并在填充过程中判断每个填充位置的上下两行中的相邻像素是否需要填充,将需要填充的相邻像素压入栈

    3)对栈中的像素进行检查,去除已被填充的像素

    4)重复第2、3步,直到栈为空。

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解)

//种子算法
QImage* MainWindow::FillArea(QImage* image,int* pos, int color,int delta)
{
    int stack[9999];
    int sk = 0;
    int stk = 0;
    int x =pos[0];
    int y =pos[1];
    int x1,y1;
    unsigned char flagBuf[image->width()][image->height()];
    memset(flagBuf,0,sizeof(unsigned char)*image->width()*image->height());
    QImage* newImage = new QImage(image->height(),image->width(),QImage::Format_ARGB32);
    QColor color1;
    QColor color2;
    color1 = QColor(image->pixel(x,y));
    unsigned nowColor[3];
    nowColor[0] = color1.red();
    nowColor[1] = color1.green();
    nowColor[2] = color1.blue();
    stack[sk] = x;
    stack[sk + 1] = y;
    sk+=2;
    while(sk > 0)
    {
        sk-=2;
        int *tempStack = new int [9999];
        int*pos = new int[2];
        pos[0] = stack[sk];
        pos[1] = stack[sk+1];

        x1 = pos[0];
        y1 = pos[1];
        stk = 0;
        newImage->setPixel(x1,y1,qRgb(color,color,color));
        flagBuf[x1][y1] = 1;
        for(int step = -1; step<=1; step+=2)
        {
            x1 = pos[0] + step;
            y1 = pos[1];
            while(x1>=0 && x1 < image->width())
            {
                color2 = QColor(image->pixel(x1,y1));
                if(abs(color2.red() - nowColor[0])<delta && abs(color2.green() - nowColor[1])<delta && abs(color2.blue() - nowColor[2])<delta)
                {
                    image->setPixel(x1,y1,qRgb(color,color,color));
                    flagBuf[x1][y1] = 1;
                    color2 = QColor(image->pixel(x1,y1-1));
                    if(y1>0 && flagBuf[x1][y1 -1] == 0 && abs(color2.red() - nowColor[0])<delta && abs(color2.green() - nowColor[1])<delta && abs(color2.blue() - nowColor[2])<delta)
                    {
                        tempStack[stk]=x1;
                        tempStack[stk +1] = y1-1;
                        stk +=2;
                    }
                    color2 = QColor(image->pixel(x1,y1+1));
                    if(y1<image->height() - 1 && flagBuf[x1][y1+1] == 0 && abs(color2.red() - nowColor[0])<delta && abs(color2.green() - nowColor[1])<delta && abs(color2.blue() - nowColor[2])<delta)
                    {
                        tempStack[stk]=x1;
                        tempStack[stk +1] = y1+1;
                        stk +=2;
                    }
                    x1+=step;
                }
                else
                    break;
            }
         }
        tempStack[stk]=-1;
        int k =0;
        for(int i = 0;i<sk;i+=2)
        {
            x = stack[i];
            y= stack[i+1];
            if(flagBuf[x][y] == 0)
            {
                stack[k] = stack[i];
                stack[k+1] = stack[i+1];
                k+=2;
            }
        }
        sk = k;
        int i = 0;
        while(tempStack[i]!=-1)
        {
            stack[sk]=tempStack[i];
            stack[sk+1]=tempStack[i+1];
            sk+=2;
            i+=2;
        }
    }
    return image;
}

3.项目源码下载:
整套算法系列:
https://blog.csdn.net/u013289254/category_12811658.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/u013289254/category_12811658.html?spm=1001.2014.3001.5482项目源码下载地址:关注WX【AI街潜水的八角】,回复【qt图像算法】即可下载

整套项目源码内容包含

[1].根据算法原理,编写纯c++源码,不调用外源库opencv 等;
[2].包括各种图像处理的基本算法,包含腐蚀膨胀,缩放,转置,镜像,平移,均衡变化,灰度拉升,灰度阈值,灰度非线性,转灰度,灰度线性,旋转,简单平滑,高斯平滑,轮廓跟踪,种子算法,hough直线检测,拉普拉斯,带方向边缘检测,常规边缘检测(梯度算子、Roberts算子和Sobel算子),中值滤波,反色操作等;
[3].程序中有完整的注释,便于大家很好理解代码。

标签:int,image,调包,像素,算法,图像,y1,x1
From: https://blog.csdn.net/u013289254/article/details/143090575

相关文章

  • 代码随想录算法训练营第五天| 面试题02.07.链表相交、leetcode142 环形链表II
    1.leetcode面试题02.07.链表相交题目链接:面试题02.07.链表相交-力扣(LeetCode)文章链接:代码随想录1.1代码跟着老师写的一个版本,自己能理解思路了,但是写的话可能还是有一些难#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#......
  • 八大排序算法
    冒泡排序最简单的排序方法之一,且看其定义。定义:冒泡排序(BubbleSort)是一种简单的排序算法。它重复地遍历待排序的列表,比较每对相邻的项目,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行直到没有再需要交换,也就是说该列表已经排序完成。这个算法的名字由来......
  • K近邻算法(KNN)的概述与实现
    K近邻算法(K-NearestNeighbors,简称KNN)是一种简单而有效的机器学习算法,广泛应用于分类和回归问题中。KNN的主要特点是不需要对数据进行显式的模型训练,它是一种基于实例的学习方法。当给定一个未标记的数据点时,KNN算法会寻找其在训练集中最接近的K个邻居,并根据这些邻居的标签来决......
  • 多任务学习算法在推荐系统中的应用
    粗略来看,推荐算法可以简单地分为召回和排序两个阶段。召回模块负责从海量的物品库里挑选出用户可能感兴趣的物品子集,过滤之后通常返回几百个物品。排序模块负责对召回阶段返回的物品集个性化排序,通常返回几十个物品组成的有序列表。总结起来,召回和排序有如下特点:召回层:候选集规......
  • 【大数据分析与挖掘算法】matlab实现——DBSCAN聚类方法
    实验六:DBSCAN聚类方法一、实验目的掌握DBSCAN聚类方法的基本理论,通过编程对实例进行聚类。二、实验任务对DBSCAN聚类方法进行编码计算,实例如下:三、实验过程1.DBSCAN聚类模型介绍:2.具体步骤介绍:四、实验结果实现平台:Matlab2022A实验代码:%示例数据data=......
  • 仅十亿参数!AI图像生成模型Meissonic AI在手机上就能生成高质量图像
    最近,科研团队联合推出了一款名为Meissonic的开源AI图像生成模型。惊喜的是,这款模型仅使用了十亿个参数,却能生成高质量的图像。这种紧凑的设计让Meissonic有潜力在移动设备上实现本地化的文本转图像应用。这项技术的背后,研发团队包括阿里巴巴、SkyworkAI以及多所大......
  • C++编程-贪心算法2
    目录先言例题三:删数问题(NOI1994)题目描述算法分析标准程序-字符串String例题四:拦截导弹问题题目描述算法分析主要框架(标准程序)例题五:活动选择题目描述算法分析标准程序先言今天讲贪心算法的第3~5例题例题三:删数问题(NOI1994)题目描述【题目描述】输......
  • 209号资源-源程序:(SIC)黑翼风筝算法:一种受自然启发的元启发式算法,用于解决基准函数和工
    ......
  • YOLOv11改进策略【卷积层】| ECCV-2024 Histogram Transformer 直方图自注意力 适用于
    一、本文介绍本文记录的是利用直方图自注意力优化YOLOv11的目标检测方法研究。在目标检测任务中,清晰准确的图像对于目标检测至关重要,本文创新方法通过恢复图像质量,可以减少因图像质量低导致的误检和漏检,实现有效涨点。专栏目录:YOLOv11改进目录一览|涉及卷积层、轻量化......
  • 【优选算法篇】踏入算法的深邃乐章:滑动窗口的极致探秘
    文章目录C++滑动窗口详解:进阶题解与思维分析前言第二章:进阶挑战2.1水果成篮解法一:滑动窗口解法二:滑动窗口+数组模拟哈希表复杂度分析:图解分析:示例:滑动窗口执行过程图解:详细说明:2.2找到字符串中所有字母异位词解法:滑动窗口+哈希表复杂度分析:图解分析:滑动窗口执......