连通域去噪

/* 漫水法填充标定实现
copy from: http://blog.csdn.net/zhjx2314/article/details/1629702
*/

写好的去噪,想优化一下代码,结果去噪那部分丢了。。。有空再重写吧

floodfill(Mat &src)
{
    struct Seed{
        int x;
        int y;
    };

    class mPoint{
    public:
        mPoint(int xx, int  yy, int mflag)
        {
            x = xx;
            y = yy;
            flag = mflag;
        }
    public:
        int x;
        int y;
        int flag;
    };

    int Row = src.rows;
    int Col = src.cols;

    int flag = 30;

    Seed *Seeds;
    int StackPoint;

    int pixe;

    //当前像素位置
    int curx, cury;

    //分配种子空间
    Seeds = new Seed[Row*Col];

    //计算每个标定值的像素个数
    int count[251];
    for (int i = 0; i < 252; i++)
    {
        count[i] = 0; //初始化为0
    }

    uchar *p = src.data;
    for (int i = 0; i < src.rows; i++)
    {
        for (int j = 0; j < src.cols; j++)
        {

            if (*(p + i*src.cols + j) == 0)
            {
                Seeds[1].x = j;
                Seeds[1].y = i;
                StackPoint = 1;

                while (StackPoint != 0)
                {
                    curx = Seeds[StackPoint].x;
                    cury = Seeds[StackPoint].y;
                    StackPoint--;

                    //取当前指针所处的像素值
                    pixe = *(p + cury*Col + curx);

                    //将指针所处的像素标定
                    *(p + cury*Col + curx) = flag;
                    count[flag]++;

                    //判断左面的点,如果为黑,则压入堆栈
                    //注意防止越界
                    if (curx > 0)
                    {
                        pixe = *(p + cury*Col + curx - 1);
                        if (pixe == 0)
                        {
                            StackPoint++;
                            Seeds[StackPoint].x = curx - 1;
                            Seeds[StackPoint].y = cury;
                        }
                    }

                    //判断右面的点,如果为黑,则压入堆栈
                    //注意防止越界
                    if (curx < Col)
                    {
                        pixe = *(p + cury*Col + curx + 1);
                        if (pixe == 0)
                        {
                            StackPoint++;
                            Seeds[StackPoint].x = curx + 1;
                            Seeds[StackPoint].y = cury;
                        }
                    }

                    //判断上面的点,如果为黑,则压入堆栈
                    //注意防止越界
                    if (cury > 0)
                    {
                        pixe = *(p + (cury - 1)*Col + curx);
                        if (pixe == 0)
                        {
                            StackPoint++;
                            Seeds[StackPoint].x = curx;
                            Seeds[StackPoint].y = cury - 1;
                        }
                    }

                    //判断下面的点,如果为黑,则压入堆栈
                    //注意防止越界
                    if (cury < Row)
                    {
                        pixe = *(p + (cury + 1)*Col + curx);
                        if (pixe == 0)
                        {
                            StackPoint++;
                            Seeds[StackPoint].x = curx;
                            Seeds[StackPoint].y = cury + 1;
                        }

                    }

                }//end while( StackPoint != 0)  

                flag = (flag + 7) % 251;//改变标定值

            }//end if
        }//end for(i
    }//end for(j  

    //释放堆栈
    delete Seeds;

}
时间: 2025-01-11 21:55:55

连通域去噪的相关文章

OpenCV &mdash;&mdash; 图像局部与部分分割(一)

背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 -- 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 新的前景(物体移动的新位置) -- 旧的前景 (物体离开后留下的"空洞")-- 背景 cvInitLineIterator()  和  CV_NEXT_LINE_POINT() 对任意直线上的像素进行采样 // 从视频的一行中读出所有像素的RGB值,收集这些数值并将其分成三个文件 #inc

[综]前景检测GMM

tornadomeet 前景检测算法_4(opencv自带GMM) http://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531705.html 前面已经有3篇博文介绍了背景减图方面相关知识(见下面的链接),在第3篇博文中自己也实现了gmm简单算法,但效果不是很好,下面来体验下opencv自带2个gmm算法. opencv实现背景减图法1(codebook和平均背景法) http://www.cnblogs.com/tornadomeet/

opencv视频跟踪2

在前面的报告中我们实现了用SURF算法计算目标在移动摄像机拍摄到的视频中的位置.由于摄像机本身像素的限制,加之算法处理时间会随着图像质量的提高而提高,实际实验发现在背景复杂的情况下,结果偏差可能会很大. 本次改进是预备在原先检测到的特征点上加上某种限制条件,以提高准确率. 问题:如何判定检测到的特征点是否是我们需要的点(也就是目标区域上的点)? 可行方案:用形态学找出目标的大致区域,然后对特征点判定. 特征点(SURF算法或者其他的算法)已有,我们来一步步实现找到目标大致区域. 下图假设为视频中

前景检测算法_3(GMM)

摘要 本文通过opencv来实现一种前景检测算法——GMM,算法采用的思想来自论文[1][2][4].在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应.然后在测试阶段,对新来的像素进行GMM匹配,如果该像素值能够匹配其中一个高斯,则认为是背景,否则认为是前景.由于整个过程GMM模型在不断更新学习中,所以对动态背景有一定的鲁棒性.最后通过对一个有树枝摇摆的动态背景进行前景检测,取得了较好的效果. 关键字:GMM,opencv,前景

(翻译)deeplearning.net/tutorial —— 栈式去噪自编码器(SdA)

前言 栈式去噪自编码器是栈式自动编码器的扩展[Bengio07],并且它在[Vincent08]里有介绍. 这次教程建立在之前的去噪自编码器Denoising Autoencoders.如果你对自编码器没什么了解,建议你先了解一下. 栈式自编码器 通过把上一层去噪自编码器找到的隐藏输入(output code)当作下一层的输入,我们可以把去噪自编码器以栈的形式构成一个深度网络.这种无监督预训练的结构在一层里同时实现.每一层当作一个去噪自编码器,通过重构输入(上一层的输出)最小化损失.一旦前面 层

OpenCV连通域相关操作

连通域反选 在使用Opencv的findcontours函数寻找连通域轮廓时,可能需要使用到类似PS中的选区反选功能. 以下对这一部分进行说明: 在findcontours函数中的mode参数中选择CV_RETR_CCOMP两级轮廓查找, 构建反选的选区范围为图像大小 vector<cv::Point> boundcontours(4); boundcontours[0] = cv::Point(0, 0); boundcontours[1] = cv::Point(0, src.rows-1

基于谱减法的声音去噪

转载请注明出处: http://xiahouzuoxin.github.io/notes/ 谱减法模型 实际听觉环境中,肯定是含有噪声的,那掺杂有噪声的声音信号中原声音信号和噪声信号是如何体现的呢?一种普遍被使用的方法是:采集到的声音信号永远都是原信号与噪声信号的叠加,即 模型是信号的直接叠加,这就要满足:原信号与噪声信号不相关.其实有些情况下这个条件是不满足的,所以依然有很多其他的模型,如有人认为原信号和噪声信号是卷积的关系.当然,这些都是模型,还没有明确的理论证明那种是对的,反正哪种好用我们

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

数学之路-python计算实战(16)-机器视觉-滤波去噪(邻域平均法滤波)

# -*- coding: utf-8 -*- #code:[email protected] #邻域平均法滤波,半径为2 import cv2 import numpy as np fn="test3.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) #加上椒盐噪声 param=20 #灰阶范围 w=img.shape[1] h=img.shape[0] newimg=np.array(img)