python 简单图像处理(14) 灰度图腐蚀和膨胀,开运算、闭运算
在前面,我们讲了二值图的腐蚀和膨胀运算
其实我们很容易把腐蚀和膨胀的概念扩展到灰度图上面去
在讲二值图时,我们把粗框区域作为黑色区域
而对于灰度图,我们把粗框区作为整个图形区域
对于图形中的任一点,以其为中心的一个窗口,在窗口与原图的重合部分。
若我们把重合区域中所有点灰度值的最大值赋给当前点,就是对灰度图的腐蚀操作
若我们把重合区域中所有点灰度值的最小值赋给当前点,就是对灰度图的膨胀操作
我们能看到,除了图像边缘的点之外,一般点的重合区域都和所选的窗口一样大
如图中,我们把一个圆作为一个窗口。同样,你能把任意形状作为窗口
好啦,我们就以方框作为窗口来编程
import cv
def Change(image,flag = 0,num = 2):
w = image.width
h = image.height
size = (w,h)
iChange = cv.CreateImage(size,8,1)
for i in range(h):
for j in range(w):
a = []
for k in range(2*num+1):
for l in range(2*num+1):
if -1<(i-num+k)<h and -1<(j-num+l)<w:
a.append(image[i-num+k,j-num+l])
if flag == 0:
k = max(a)
else:
k = min(a)
iChange[i,j] = k
return iChange
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的图。跑上面的程序需要花六七秒的时间
不知道有没有什么好方法
好了,我们来看看运行效果吧
(若例子中使用的图有版权问题,请与我联系)
腐蚀图像相对原图偏亮,膨胀图像相对原图偏暗
好啦,这就是灰度图的腐蚀操作
和前面的二值图操作其实很像