图像处理击中和不击中_图像处理 击中或不击中变换 - CSDN
精华内容
参与话题
  • 图像处理3:击中中算法 (1)击中中简介: 击中中变换是形态学形状检测的基本工具,是用来查找像素局部模式的形态学运算符,其中局部是指结构元素的大小。 两个相交集合B=(B1, B2),称B为复合结构元素...

    图像处理3:击中击不中算法

    (1)击中击不中简介:

               击中击不中变换是形态学形状检测的基本工具,是用来查找像素局部模式的形态学运算符,其中局部是指结构元素的大小。

               两个不相交集合B=(B1, B2),称B为复合结构元素。则击中击不中变换为:用B1去腐蚀x,然后用B2去腐蚀X的补集,得到的结果相减就是击中击不中变换。

    (2)击中击不中算法原理:

              如果要在一幅图像A上找到B形状的目标:

              ①建立一个比B大的模板W,使用此模板对图像A进行腐蚀,得到图像假设为Process1;

              ②用B减去w,从而得到V模板(W-B),使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;

              ③Process1与Process2取交集,得到的结果就是B的位置,这里的位置可能不是B的中心位置。

    (3)击中击不中算法原理:

            击中击不中算法的原理基于腐蚀运算的一个特性:腐蚀的过程相当于对可以填入结构元素的位置作标记的过程。

            腐蚀过程中,虽然标记点取决于原点在结构元素中的相对位置,但输出图像的形状与此无关,改变原点的位置,只会导致输出结果发生平移。既然腐蚀的过程相当于对可以填入结构元素的位置作标记的过程,可以利用腐蚀来确定目标的位置。

            进行目标检测,既要检测到目标的内部,也要检测到外部,即在一次运算中可以同时捕获内外标记。

            由于以上两点,采用两个结构基元H,M,作为一个结构元素对B= (H, M) ,一个探测目标内部,一个探测目标外部。当且仅当H平移到某一点可填入X的内部, M平移到该点可填入X的外部时,该点才在击中击不中变换的输出中。

    (4)击中击不中算法的应用:

            ①物体识别:将击中基元设计成为需要识别的图像的样子,击不中基元设计为击中基元取反后的样子,然后用这两个基元对图像进行检测即可。

            ②图像细化:将图像变细,就像取到了图像的骨架。

    (5)击中击不中算法的结构元素:

             选取击中击不中需要两个结构基元E和F,这两个结构基元一个探测图像内部,一个探测图像外部。当被测图像上目标击中"击中元素" ,但击不中"击不中结构元素"时,将该目标输出。

    (6)击中击不中算法的Halcon实现:

             hit or miss(Region, StructElement1, StructElement2, RegionHitMiss, Row, Column)

             首先,在输入区域Region上对结构元素结构1StructElement1进行腐蚀,然后在输入区域的补集上对结构元素2StructElement2进行腐蚀,两个结果区域的交集是算法的结果区域。

    展开全文
  • Opencv实现击中

    千次阅读 多人点赞 2014-04-08 19:43:48
    《数字图像处理与机器视觉——Visual C++与Matlab实现》P289公式8-7明显错误,但是后面的图是正确的。 详细知识可以看击中中,里面的图示跟书本中介绍的差不多。 另外书本中介绍:背景的宽度选择会影响最后的...

    《数字图像处理与机器视觉——Visual C++与Matlab实现》P289公式8-7明显错误,但是后面的图是正确的。

    《数字图像处理与机器视觉》 该书下载地址:http://pan.baidu.com/share/link?shareid=3551301329&uk=1610854122

    详细知识可以看击中击不中,里面的图示跟书本中介绍的差不多。

    另外书本中介绍:背景的宽度选择会影响最后的计算结果,以致最终的计算结果是空集。






    	Mat input_image = src;
    	Mat Kernel_S1 = imread("Kernel_3.bmp");//核-数字3
    	cvtColor(Kernel_S1, Kernel_S1, CV_RGB2GRAY);
    	int threhold = 180;
    	threshold(input_image, input_image, threhold, 255, CV_THRESH_BINARY);
    	threshold(Kernel_S1, Kernel_S1, threhold, 255, CV_THRESH_BINARY);
    	imshow("二值化图像", input_image);
    	Mat Blankimage = Mat::ones(Kernel_S1.rows, Kernel_S1.cols, CV_8UC1);
    	Mat Kernel_S2 = Blankimage * 255 - Kernel_S1;
    	imshow("核1", Kernel_S1);
    	imshow("核2", Kernel_S2);
    
    
    	Mat hit_result, hit_result1, hit_result2;
    	/// 腐蚀
    	erode(input_image, hit_result1, Kernel_S1, Point(-1,-1), 1, BORDER_DEFAULT, 0);
    	imshow("hit_result1", hit_result1);
    	Mat BigBlankimage = Mat::ones(input_image.rows, input_image.cols, CV_8UC1);
    	input_image = BigBlankimage * 255 - input_image;
    	imshow("反置图像", input_image);
    	/// 腐蚀
    	erode(input_image, hit_result2, Kernel_S2, Point(-1,-1), 1, BORDER_DEFAULT, 0);
    	imshow("hit_result2", hit_result2);
    	hit_result = hit_result1 & hit_result2;
    	imshow("击中击不中", hit_result);
    	/// 查找击中点,验证结果
    	for (int i = 0; i <input_image.rows; ++i)
    	{
    		uchar* data = hit_result.ptr<uchar>(i);
    		for (int j = 0; j <input_image.cols; ++j)
    		{
    			int temp = (int)data[j];
    			if (temp)
    				cout << "Find "<<temp;
    		}
    	}


    展开全文
  • 击中中变换(HMT)需要两个结构元素B1B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击中部分。显然,B1B2是应该相连接的,即B1∩B2=Φ。击中中变换的...

    击中击不中变换

    原理

    击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2)

    一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分。显然,B1和B2是不应该相连接的,即B1∩B2=Φ。击中击不中变换的数学表达式为:

    g(x, y)=hitmiss[f(x, y), B]=erode[f(x, y), B1]AND erode[fc(x, y), B2]

    其中,fc(x,y)表示的是f(x,y)的补集。

    作用

    击中击不中变换就是在A图像上找到和B图像一致的那块区域,举个例子就是:你拿着一张A图片的一部分,你需要在A图像上找到这张图片在A图片上的位置在哪

    算法步骤

    1. 这里把A图像作为原图像 B图像是目标形状,这里我们将B作为结构元素
    2. 建立一个比B大的模板W,计算出模板V (W-B),这里是为了满足原理中B1、B2无交集的条件
    3. 用B作为结构元素对A进行腐蚀
    4. 用V作为结构元素对A的补集进行腐蚀
    5. 取两张腐蚀后图片的交集

    举例分析
    在A图中寻找B图所示的图像目标的位置
    在这里插入图片描述
    步骤:

    1、确定结构元素

    既然是寻找图B所示形状,选取H为图B所示的形状。再选一个小窗口W,W包含H,M=W-H。如下图所示:
    在这里插入图片描述
    2、求H对A的腐蚀结果
    在这里插入图片描述
    3、求M对A补集的腐蚀
    在这里插入图片描述
    4.两张腐蚀图片求交集

    图片Y中左上角那个红点就是B在A中的位置
    在这里插入图片描述
    MATLAB实战

    t=zeros(500,500);
    
    for i=100:200
    for j=100:200
    t(i,j)=1;
    end
    end
    
    for i=70:140
    for j=370:440
    t(i,j)=1;
    end
    end
    
    for i=300:400
    for j=300:480
    t(i,j)=1;
    end
    end
    
    imshow(t);%构造原图
    
    m=zeros(100,100);
    
    for i=1:100
    for j=1:100
    m(i,j)=1;
    end
    end
    
    figure,imshow(m);%构造m结构元素
    
    n=zeros(120,120);
    
    for i=1:120
    for j=1:120
    n(i,j)=1;
    end
    end
    
    for i=10:110
    for j=10:110
    n(i,j)=0;
    end
    end
    
    figure,imshow(n);%构造n结构元素 与m交集为空
    
    x1=imerode(t,m);
    figure,imshow(x1);%原图被m结构元素腐蚀后
    x2=imerode(~t,n);
    figure,imshow(x2);%原图补集被n结构元素腐蚀后
    
    x3=x1.*x2;
    figure,imshow(x3);%求两张腐蚀后图像的交集
    

    结果图

    1.原图
    原图A
    2.m对A腐蚀后
    在这里插入图片描述
    3.n对A补集腐蚀后
    在这里插入图片描述
    4.两张腐蚀图求交集后

    图中左上角就是B在A中的位置
    在这里插入图片描述
    总结

    • 这里击中击不中变换还是有点难理解,至于为什么进行两次腐蚀,就可以找到B在A中的位置,这里就不讨论了,反正我们只需要知道进过这样的运算可以得到结果即可(这里其实自己对那个变换公式原理有点不是很理解)
    • 这里有个很大的坑,就是如果按照原理上的图进行变换,是得不到最终答案的。其原因就是在MATLAB中,白色是1,黑色是0。在课本上,定义的结构元素有效值是1,也就是白色,而上面原理包括课本上则是默认黑色进行腐蚀的。所以,为了验证原理,我们只需要将颜色反转即可(黑变白,白变黑)。
    • 这里对腐蚀、膨胀一定要理解清楚,特别是结构体元素有效值为1,MATLAB中1是白色,我被这个坑惨了
    • 击中击不中的用处就是 在图像A中寻找图像B在A中的位置
    展开全文
  • 数字图像处理入门(一) 击中

    千次阅读 2013-11-18 18:19:06
    形态学的击中和中是形状检测的基本工具。 其基本原理为:(集合X为原二值化图像的像素集合,对X取反求得~X(非X, Y表示), 选择的结构元为s1, 对结构元s1取反的结构元为s2) 首先对用s1对X进行腐蚀得到A1,, 用s2对...

    形态学的击中和击不中是形状检测的基本工具。

    其基本原理为:(集合X为原二值化图像的像素集合,对X取反求得~X(非X, Y表示), 选择的结构元为s1, 对结构元s1取反的结构元为s2)

    首先对用s1对X进行腐蚀得到A1,, 用s2对Y(即~X)进行腐蚀得到A2。最终结果C = A1 & A2。

    对本次的样例图片,我们选取以下的结构元s1:

    0 0 1 0 0

    0 0 1 0 0

    1 1 1 1 1

    0 0 1 0 0

    0 0 1 0 0                              

    对其取反后的结构元s2为:

                                 1 1 0 1 1

                                 1 1 0 1 1

                                 0 0 0 0 0

                                 1 1 0 1 1

                                 1 1 0 1 1                        

    我们要做就是用s1腐蚀原图像X, 用s2去腐蚀对X取反的图像Y,然后对2个最终的结果相与即可。

    公式为:    

                           


    代码如下:其中m_dib为打开的bmp图像,m_dib.GetBits()为获得图像的像素

    void CImgDoc::OnHit()
    {
    	if( m_dib.IsValid() )
    	{
            int  width = m_dib.GetWidth();
    		int  height = m_dib.GetHeight();
    		int  pitch = ( width*8+31)/32*4;					//步长
    
    		unsigned char* bufNotImg = new unsigned char[height*pitch];		//原图像的反
    		unsigned char* bufErodeImg = new unsigned char[height*pitch];		//定义好的结构元腐蚀原图像
    		unsigned char* bufErodeNotImg = new unsigned char[height*pitch];	//取反的结构元腐蚀取反的原图像
    		unsigned char* bufRes = new unsigned char[height*pitch];		//击中击不中目标图像
    
    		//初始化
    		memset(bufNotImg, 0x00, height*pitch);
    		memset(bufErodeImg, 0x00, height*pitch);
    		memset(bufErodeNotImg, 0x00, height*pitch);
    		memset(bufRes, 0x00, height*pitch);
    
    		//定义的腐蚀结构元
    		//  0 0 1 0 0
    		//  0 0 1 0 0
    		//  1 1 1 1 1
    		//  0 0 1 0 0
    		//  0 0 1 0 0
    		Pt s1[9];
    		s1[0].x = 0; s1[0].y = -2;
    		s1[1].x = 0; s1[1].y = -1;
    		s1[2].x = 0; s1[2].y = 0;
    		s1[3].x = 0; s1[3].y = 1;
    		s1[4].x = 0; s1[4].y = 2;
    		s1[5].x = -2; s1[5].y = 0;
    		s1[6].x = -1; s1[6].y = 0;
    		s1[7].x = 1; s1[7].y = 0;
    		s1[8].x = 2; s1[8].y = 0;
    
    		//将上面的结构元取反,共16个,比较戳的写法,将最中间的点设为原点,其余点即为相对于原点的坐标
    		Pt s2[16];
    		s2[0].x = -2; s2[0].y = -2;
    		s2[1].x = -1; s2[1].y = -2;
    		s2[2].x = 1; s2[2].y = -2;
    		s2[3].x = 2; s2[3].y = -2;
    		s2[4].x = -2; s2[4].y = -1;
    		s2[5].x = -1; s2[5].y = -1;
    		s2[6].x = 1; s2[6].y = -1;
    		s2[7].x = 2; s2[7].y = -1;
    		s2[8].x = -2; s2[8].y = 1;
    		s2[9].x = -1; s2[9].y = 1;
    		s2[10].x = 1; s2[10].y = 1;
    		s2[11].x = 2; s2[11].y = 1;
    		s2[12].x = -2; s2[12].y = 2;
    		s2[13].x = -1; s2[13].y = 2;
    		s2[14].x = 1; s2[14].y = 2;
    		s2[15].x = 2; s2[15].y = 2;
    
    		//1、求取反的图像
    		for(int y = 0; y < height; y ++)     
    		{
    			for(int x = 0; x < width; x ++)
    			{
    				if(m_dib.GetBits()[y*pitch+x])
    					bufNotImg[y*pitch+x] = 0x0;
    				else bufNotImg[y*pitch+x] = 0xFF;
    			}
    			
    		}
    
    		//2、经过结构元s1的源图像的腐蚀
    		//参数:原图像的缓冲区像素,宽度,高度,步长,目标腐蚀图像缓冲区,目标图像步长,结构元,结构元点数
    		Erode(m_dib.GetBits()+2*pitch+4, width-4, height-4, pitch, 
    			bufErodeImg, pitch, s1, 9);
    
    		//3、经过结构元的反s2的源图像的反图像的腐蚀
    		Erode(bufNotImg+2*pitch+4, width-4, height-4, pitch, 
    			bufErodeNotImg, pitch, s2, 16);
    
    		//4、经过求第3步的bufErodeImg和第4步的bufErodeNotImg求与
    		for(int y = 0; y < height; y ++)
    			for(int x = 0; x <width; x ++)
    				bufRes[y*pitch+x] = bufErodeImg[y*pitch+x] & bufErodeNotImg[y*pitch+x];
    
    		CDib::SaveImg8("G:\\bufNotImg.bmp", bufNotImg, width, height, pitch);
    		CDib::SaveImg8("G:\\bufErodeImg.bmp", bufErodeImg, width, height, pitch);
    		CDib::SaveImg8("G:\\bufErodeNotImg.bmp", bufErodeNotImg, width, height, pitch);
    		CDib::SaveImg8("G:\\bufRes.bmp", bufRes, width, height, pitch);
    
    		delete[] bufRes;
    		delete[] bufErodeNotImg;
    		delete[] bufErodeImg;
    		delete[] bufNotImg;
    	}
    
    }
    


    腐蚀的方法如下:(方法略戳,勿喷)
    void Erode( const unsigned char* srcBuf, int w, int h, int pitch,
    		   unsigned char* dstBuf, int dstPitch, Pt pt[], int nCount )
    {
        for( int y = 0; y < h; y++ )
    	{
    		for( int x = 0; x < w; x++)
    		{
    			int n = 0;
    			for( int i = 0; i < nCount; i++ )
    			{
                                 if( srcBuf[(y+pt[i].y)*pitch+(x+pt[i].x)] )
    					n++;
    			}
    			if( n == nCount )
    			    dstBuf[y*dstPitch+x] = 0xFF;
    		}
    	}
    }


    展开全文
  • 击中中变换击中中变换是形状检测的一个基本工具,先看定义一般来说,设给定原图像X中包含A在内的多个不同物体,假设定位目标A,为此设置一个形状模板A,此时取一个比A稍大的B,且A与B的边缘相交,令B1=A,...
  • 要想学习本章内容,则需要提前看一下我的另外一篇博客:图像的腐蚀与膨胀之c++实现(qt + 调包),本章内容将从击中/不击中运算细化处理这两个方面介绍 1.击中/不击中运算 图像的腐蚀是可以除去目标图像中与...
  • 设X为目标图像,B为结构元素,且B由两个相交的部分B1B_1B1​B2B_2B2​组成,即B=B1∪B2B=B_1∪B_2B=B1​∪B2​,且B1∩B2=ϕB_1∩B_2=\phiB1​∩B2​=ϕ。则目标图像X被结构元素B击中的数学表达式: X⊗B={x∣(B1...
  • https://www.cnblogs.com/dearzhoubi/p/8714941.html
  • #include"matrix.h" #include"iostream.h" voidmain(void) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grayimag A, G; &nbsp;...
  • 击中中变换的作用理解

    万次阅读 多人点赞 2015-12-01 13:17:35
    学习形态学变换的时候,看到击中中变换一直百思不得其解,虽然他的定义写的很清楚明白,但是知道具体是干嘛用的,按照自己的理解写了一个matlab小程序来试试。 1、击中中变换是形态学形状检测的基本工具...
  • 最近学习图像处理,发现一个特别酷的操作,如标题所述。 原图 切换灰度图 img2gray()函数就可以实现 对灰度图进行闭运算消除噪声 seDisk=strel('disk',5,0); %构造圆盘 imgClose=imclose(imgGray,seDisk); 大津...
  • 连通子图的匹配定位,像素模式的匹配定位
  • 击中与击中变换

    2018-10-06 21:24:13
    击中与击中变换是形状检测的一个基本工具,其思路非常简单。 公式如下: A⊗B=(A⊖D)∩[Ac⊖(W−D)]A\otimes B=(A\ominus D)\cap [A^c\ominus(W-D)]A⊗B=(A⊖D)∩[Ac⊖(W−D)] 其中A是被寻找图像,D是被寻找图形,...
  • 输出图像由所有在B1中匹配的像素(击中未在B2中匹配的像素(击中)组成。 例子: f = imread('FigP0918(left).tif') imshow(f) B1 = strel([0 0 0; 0 1 1; 0 1 0]) B2 = strel([1 1 1; 1 0 0...
  • 形态学图像处理(一)预备知识1.1 预备知识1.1.1 集合理论中的基本概念1.2 二值图像、集合及逻辑算子(二)膨胀腐蚀2.1 膨胀2.2 结构元的分解2.3 strel函数2.4 腐蚀(三) 膨胀与腐蚀的结合3.1 开操作闭操作3.2 ...
  • C#语言、VS2005开发环境下的数学形态学图像处理,包括图像腐蚀运算、膨胀运算、开与闭运算、击中中变换!
  • 形态学(morphology)一...其基本的运算包括:二值腐蚀膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀膨胀、灰值开闭运算、灰值形态学梯度等。
  • 击中-击中变换 (二值)   所采用的9*1 自定义结构为:     函数:lhMorpHMTB 说明:形态学二值击中-击中变换 参数: src 输入图像,二值图像 dst 输出图像 sefg 前景结构元素 sebg 背景结构...
  • 第九章 形态学图像处理 第九章 形态学图像处理 一腐蚀膨胀 1 腐蚀 2 膨胀 二开操作与闭操作 三击中或击中变换 四一些基本的形态学算法 1 边界提取 2 孔洞填充 3 连通分量的提取 4 凸壳 5 细化 6 粗化 7 ...
1 2 3 4 5 ... 20
收藏数 2,381
精华内容 952
关键字:

图像处理击中和不击中