在前面,我们讲了二值图的腐蚀和膨胀运算
其实我们很容易把腐蚀和膨胀的概念扩展到灰度图上面去
在讲二值图时,我们把粗框区域作为黑色区域
而对于灰度图,我们把粗框区作为整个图形区域
对于图形中的任一点,以其为中心的一个窗口,在窗口与原图的重合部分。
若我们把重合区域中所有点灰度值的最大值赋给当前点,就是对灰度图的腐蚀操作
若我们把重合区域中所有点灰度值的最小值赋给当前点,就是对灰度图的膨胀操作
我们能看到,除了图像边缘的点之外,一般点的重合区域都和所选的窗口一样大
如图中,我们把一个圆作为一个窗口。同样,你能把任意形状作为窗口
好啦,我们就以方框作为窗口来编程
importcvdefChange(image,flag=0,num=2):
w=image.width
h=image.height
size=(w,h)
iChange=cv.CreateImage(size,8,1)foriinrange(h):forjinrange(w):
a=[]forkinrange(2*num+1):forlinrange(2*num+1):if-1
a.append(image[i-num+k,j-num+l])ifflag==0:
k=max(a)else:
k=min(a)
iChange[i,j]=kreturniChange
image=cv.LoadImage('lena.jpg',0)
iCorrode=Change(image)
iExpand=Change(image,1)
iOpen=Change(iCorrode,1)
iClose=Change(iExpand)
cv.ShowImage('image',image)
cv.ShowImage('iCorrode',iCorrode)
cv.ShowImage('iExpand',iExpand)
cv.ShowImage('iOpen',iOpen)
cv.ShowImage('iClose',iClose)
cv.WaitKey(0)
函数中flag为0表示腐蚀,为其它值是表示膨胀
num=2 表示为5×5的窗口
我们可以在调用函数的时候改变窗口的大小
我们在处理的时候用了多层循环,所以计算会花很长时间,我用一幅256×256的图。跑上面的程序需要花六七秒的时间
不知道有没有什么好方法
好了,我们来看看运行效果吧
(若例子中使用的图有版权问题,请与我联系)
腐蚀图像相对原图偏亮,膨胀图像相对原图偏暗
好啦,这就是灰度图的腐蚀操作
和前面的二值图操作其实很像