图像高级操作和形态学

一.模块的匹配

一.模块匹配的方法

result=cv2.matchTemplate(image,templ,method,mask)

image:原始图像

templ:模板图像,尺寸必须小于或等于原始图像

method:匹配的方法,可用参数如下所示

cv2.TM_SQDIFF#差值平方和匹配,也叫平方差匹配,可以理解为差异程度,匹配程度越高计算结果越小,完全匹配的结果为0
cv2.TM_SQDIFF_NORMED#标准差值平方和匹配也叫标准平方匹配,规则同上
cv2.TM_CCORR#相似度匹配,相似度越高计算结果越大
cv2.TM_CCORR_NORMED#标准相关匹配,规则同上,
cv2.TM_CCOEFF#也属于相似程度,计算结果为-1~1的浮点数1表示完全匹配,0表示毫无关系,-1表示两张图片亮度刚好相反
cv2.TM_CCOEFF_NORMED#标准相关系数匹配,规则同上

mask:可选参数。掩模,只有cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED至此此参数,建议使用默认参数

1.单模块匹配

单模块匹配之可以获取一个结果

minvalue,maxvalue,minloc,maxloc=cv.minMaxLoc(src,mask)

src:matchTemplate计算结果

mask:掩模

minvalue:数组中的最大值

maxvalue:数组中的最小值

minloc:最小值的坐标(x,y)

maxloc:最大值的坐标(x,y)

单模块匹配实操代码如下:

import cv2
import cv2 as cv
import matplotlib.pyplot as pl
image=cv.imread(r'img\jmh\img.jpg')
templ=cv.imread(r'img\jmh\img_89.jpg')
h,w,c=templ.shape#获取图片尺寸
src=cv.matchTemplate(image,templ,cv2.TM_SQDIFF_NORMED)#标准差值平方和匹配也叫标准平方匹配,规则同上
minvalue,maxvalue,minloc,maxloc=cv.minMaxLoc(src)
po1=minloc#将最小值坐标,当作最佳匹配区域的左上角点坐标
po2=(po1[0]+w,po1[1]+h)#在最小值坐标的基础上加上模板图像的尺寸
cv.rectangle(image,po1,po2,(0,0,255),2)#绘制正方形
pl.imshow(image[:,:,::-1])
pl.show()

模板

 匹配图

2.多模块匹配

实例代码如下

import cv2 as cv
import matplotlib.pyplot as pl
img1=cv.imread(r'img\jmh\F2.PNG')
img2=cv.imread(r'img\jmh\F1.PNG')
h,w,c=img2.shape
re=cv.matchTemplate(img1,img2,cv.TM_CCOEFF_NORMED)
for y in range(len(re)):
    for x in range(len(re[y])):
        if re[y][x]>0.99:
            cv.rectangle(img1,(x,y),(x+w,y+h),(0,0,255),3)
pl.imshow(img1[:,:,::-1])
pl.show()

模板

 

 匹配图

 

二.滤波器

图像中可能会出现这样一种像素,该像素与周围的差别较大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低整个图片的质量,这种像素就叫做图像的噪声。

以一个像素为核心,其周围组成一个X行X列的矩阵,这样的矩阵结构,在滤波操作中叫做滤波核。

1.均值滤波器

[[137,150,125]
 [141,35,131]#35为噪声
  [119,118,150]]
计算结果:137+150+125+141+35+131+119+118+150/3*3=123
最后会将35转化为123

dst=cvblur(src,ksize,anchor,borderType)

src:被处理的图像

ksize:滤波核大小·,例如(3,3),(5,5)边数必须为奇数滤波核越大,处理之后的图像就越模糊

anchor:滤波的锚点,默认

borderType:边界样式,默认

dst:处理后的图像

 

 

 

 

2.中值滤波器

原理:

[[137,150,125]
 [141,35,131]
 119,118,150]]
 过程:35,118,119,125,[131],137,141,150,150
 [[137,150,125]
 [141,131,131]
 119,118,150]]

dst=cv.medianBlur(src,ksize)

src:被处理的图像

ksize:滤波核边长,边长为奇数

import cv2 as cv
img=cv.imread(r'img\jmh\F2.PNG')
img1=cv.medianBlur(img,5)
img2=cv.medianBlur(img,9)
img3=cv.medianBlur(img,13)
cv.imshow('img1',img1)
cv.imshow('img2',img2)
cv.imshow('img3',img3)
cv.waitKey()
cv.destroyAllWindows()

 

 

3.高斯滤波器

高斯滤波可以很好的在降低图片噪声,细节层次,的同时保留更多的图像信息经过处理的图像呈现”磨砂玻璃“的滤镜效果

高斯的滤波计算过程中,涉及卷积运算,会有一个和滤波核大小相等的卷积核例如:

[[137,150,125],
 [141,35,131],
 [119,118,150]]
 ✖
 卷积
 [[0.05,0.1,0.05],
  [0.1,0.4,0.1],
  [0.05,0.1,0.05]]
  
  137*0.05=6.85 150*0.1=15 125*0.05=6.25
  141*0.1= 14.1 35*0.4=14 131*0.1=13.1
  119*0.05=5.95 118*0.1=11.8 150*0.05=7.5
  6.85+15+6.25*+14.1+14+13.1+5.95+11.8+7.5=94.55 约等于=95

dst=cv.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

src:被处理的图像

ksize:滤波核大小

sigmaX:卷积核水平方向的标准差

sigmaY:卷积核垂直方向的标准差

#可以设置为0,函数会自动计算

borderType:边界样式,默认

import cv2 as cv
img=cv.imread(r'img\jmh\F2.PNG')
img1=cv.GaussianBlur(img,(5,5),0,0)
img2=cv.GaussianBlur(img,(9,9),0,0)
img3=cv.GaussianBlur(img,(15,15),0,0)
cv.imshow('img1',img1)
cv.imshow('img2',img2)
cv.imshow('img3',img3)
cv.waitKey()
cv.destroyAllWindows()

 

 

 

4.双边滤波

此图来自学习书籍《python opencv从入门到精通 》明日科技

cv.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

src:被处理的图像

d:以当前像素为中心的整个滤波区域的直径

sigmaColor:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差异,只有颜色值之差小于这个数时周围的像素才进行滤波计算

sigmaSpace:坐标空间的6值,该值越大,参与计算的像素越多

borderType:边界样式

import cv2 as cv
img=cv.imread(r'img\jmh\F2.PNG')
img1=cv.GaussianBlur(img,(15,15),0,0)#使用大小为15*15的滤波核进行高斯滤波
img2=cv.bilateralFilter(img,15,120,0,0)#双边滤波,选取范围直径为15,颜色差为120
cv.imshow('img1',img1)
cv.imshow('img2',img2)
cv.waitKey()
cv.destroyAllWindows()

 

三.形态学操作

1.腐蚀可以让图像沿着自己的边缘向内收缩,cv通过核来实现收缩操作,核在形态学中可以理解为由x*x个像素组成的像素块,通常的核心是最中心也可以定义

det=cv.erode(src, kernel, anchor, iterations, borderType, borderValue)

src:原始图像

kernel:腐蚀使用的核

anchor:可选参数核的锚点

iterations:可选参数,腐蚀操作的迭代次数默认值为1

borderType:边界样式,建议默认

borderValue:边界值,建议默认

图像经过腐蚀,可以抹去一些外部的细节

import cv2 as cv
import numpy as np
k=np.ones((9,9),np.uint8)#创建3*3的数组为核
img=cv.imread(r'img\jmh\cat.jpg')
des=cv.erode(img,k)
cv.imshow('img',img)
cv.imshow('des',des)
cv.waitKey()
cv.destroyAllWindows()
#注意猫咪的胡须

原图

 腐蚀图

 2.膨胀

膨胀与腐蚀的效果相反,膨胀操作可以让图像沿着自己的边界向内扩张,同样可以使用核来计算,当核在图像的边缘操作时核会将图像边缘填补新的像素。

dst=cv.dilate(src, kernel, anchor, iterations, borderType, borderValue)

src:要操作的图像

kernel:膨胀使用的核

anchor:核的锚点

iterations:膨胀操作的迭代次数

borderType:边界样式

borderValue:边界值

3.开运算

开运算是将图像先进行腐蚀操作,在进行膨胀操作,开运算是将图像的外部细节抹去

实例代码:

import cv2 as cv
import numpy as np
k=np.ones((5,5),np.uint8)
img=cv.imread(r'img\jmh\cat.jpg')
des=cv.erode(img,k)
des=cv.dilate(des,k)
cv.imshow('img',img)
cv.imshow('des',des)
cv.waitKey()
cv.destroyAllWindows()

4.闭运算

闭运算是先将图片膨胀处理在腐蚀处理。闭运算可以将图片的內部细节抹去

import cv2 as cv
import numpy as np
k=np.ones((9,9),np.uint8)
img=cv.imread(r'img\jmh\cat.jpg')
des=cv.dilate(img,k)
des=cv.erode(des,k)
cv.imshow('img',img)
cv.imshow('des',des)
cv.waitKey()
cv.destroyAllWindows()
#闭运算会将内部细节抹去,还会让离的较近的的区域合并到一起

四.形态学运算

cv.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)

src:原始图像

op:操作类型

cv.MORPH_ERODE#腐蚀操作
cv.MORPH_DILATE#膨胀操作
cv.MORPH_OPEN#开运算,先腐蚀后膨胀
cv.MORPH_CLOSE#闭运算,先膨胀,后腐蚀
cv.MORPH_GRADIENT#梯度运算
cv.MORPH_TOPHAT#顶帽运算,原始图减去开运算图
cv.MORPH_BLACKHAT#黑帽运算,闭运算图减去原始图

kernel:操作中的核

anchor:核的锚点位置

iterations:迭代次数

borderType:边界样式

borderValue:边界值

1.梯度运算

梯度运算:因为膨胀比原图大,腐蚀比原图小,利用腐蚀图将膨胀图掏空获得外轮廓

import cv2 as cv
import numpy as np
k=np.ones((5,5),np.uint8)
img=cv.imread(r'img\jmh\cat.jpg')
 dst=cv.morphologyEx(img,cv.MORPH_GRADIENT,k)#梯度运算
cv.imshow('img',img)
cv.imshow('dst',dst)
cv.waitKey()
cv.destroyAllWindows()

 

2.顶帽运算

因为开运算抹除了图像的外部细节,有外部细节的图像减去没外部细节的图像就得到只有外部细节的图像

原图像减去原图像的开运算

import cv2 as cv
import numpy as np
k=np.ones((5,5),np.uint8)
img=cv.imread(r'img\jmh\cat.jpg')
dst=cv.morphologyEx(img,cv.MORPH_TOPHAT,k)#顶帽运算,原始图减去开运算图
cv.imshow('img',img)
cv.imshow('dst',dst)
cv.waitKey()
cv.destroyAllWindows()

 

3.黑帽运算

因为闭运算抹除图像的内部细节,无内部细节的图像减去有内部细节的图像就得到只剩内部细节的图像

import cv2 as cv
import numpy as np
k=np.ones((5,5),np.uint8)
img=cv.imread(r'img\jmh\cat.jpg')
dst=cv.morphologyEx(img,cv.MORPH_BLACKHAT,k)#黑帽运算,闭运算图减去原始图
cv.imshow('img',img)
cv.imshow('dst',dst)
cv.waitKey()
cv.destroyAllWindows()

助记模块

由于上面为实例图部分读者可能无法理解,下面为作者学习参考资料《python opencv入门到精通》明日科技  上面的图片

腐蚀运算

膨胀

开运算

 

闭运算

梯度运算

 

顶帽运算

 

黑帽运算

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
allegro是一个复用模块的框架,用于在软件开发中实现模块的重复使用和扩展。然而,有时候在使用allegro时,可能出现模块匹配不起来的情况。 出现这种问题的原因可能有几个方面。首先,可能是由于使用了不兼容的模块版本或组件,导致模块无法正确匹配。解决这个问题的方法是确保使用的每个模块和组件都是兼容的,可以尝试更新或更改模块版本来解决兼容性问题。 其次,可能是由于模块间的接口定义不匹配所致。在allegro中,模块之间通过接口进行通信和交互。如果模块的接口定义不一致,就无法正确匹配。解决这个问题的方法是仔细检查每个模块的接口定义,确保它们在数据类型、参数数量和顺序等方面一致。 另外,还有可能是由于模块的配置或初始化出现问题。在使用allegro时,需要正确配置和初始化每个模块,包括设置正确的参数、加载必要的资源等。如果配置或初始化过程有误,就会导致模块匹配不起来。解决这个问题的方法是仔细检查每个模块的配置和初始化步骤,确保它们正确执行。 总之,allegro复用模块匹配不起来可能是由于模块版本不兼容、接口定义不一致或配置初始化问题等原因所致。要解决这个问题,需要确保使用兼容的模块版本,检查每个模块的接口定义一致,并仔细配置和初始化每个模块。只有这样才能让allegro的复用模块能够正确匹配起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值