▼页尾

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的图。跑上面的程序需要花六七秒的时间

不知道有没有什么好方法

好了,我们来看看运行效果吧

 

 

(若例子中使用的图有版权问题,请与我联系)

腐蚀图像相对原图偏亮,膨胀图像相对原图偏暗

好啦,这就是灰度图的腐蚀操作

和前面的二值图操作其实很像

posted @ 2010-12-30 14:15  xiatwhu  阅读(12413)  评论(7编辑  收藏  举报
▲页首
西