zoukankan      html  css  js  c++  java
  • python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算

    我们直接看图吧

    我们把粗框内的区域看作原图像

    假设有一个圆在图像空间移动,取一个点作为圆的中心,若圆的区域被完全包含在原图像中

    则我们把它放到腐蚀后的区域中

    若只有一部分在原图像区域或没有一个点在原图区域中,我们则不会把它放在腐蚀区中

    显然,粗框区域腐蚀后会变成内部填充框区域

    而膨胀却恰恰相反

    把粗框线看作原图的话,取原图上一点为圆的中心,所以在圆的区域都被放在膨胀区

    显然,膨胀后,原图会变成外边框的区域

    上面,我们是以圆为窗的,事实上你可以使用任意窗形,不过最好有一个中心点

    好啦,我们来看看利用腐蚀和膨胀有什么效果吧

    import cv

    def Two(image):
    w
    = image.width
    h
    = image.height
    size
    = (w,h)
    iTwo
    = cv.CreateImage(size,8,1)
    for i in range(h):
    for j in range(w):
    iTwo[i,j]
    = 0 if image[i,j] <220 else 255
    return iTwo

    def Corrode(image):
    w
    = image.width
    h
    = image.height
    size
    = (w,h)
    iCorrode
    = cv.CreateImage(size,8,1)
    kH
    = range(2)+range(h-2,h)
    kW
    = range(2)+range(w-2,w)
    for i in range(h):
    for j in range(w):
    if i in kH or j in kW:
    iCorrode[i,j]
    = 255
    elif image[i,j] == 255:
    iCorrode[i,j]
    = 255
    else:
    a
    = []
    for k in range(5):
    for l in range(5):
    a.append(image[i
    -2+k,j-2+l])
    if max(a) == 255:
    iCorrode[i,j]
    = 255
    else:
    iCorrode[i,j]
    = 0
    return iCorrode

    def Expand(image):
    w
    = image.width
    h
    = image.height
    size
    = (w,h)
    iExpand
    = cv.CreateImage(size,8,1)
    for i in range(h):
    for j in range(w):
    iExpand[i,j]
    = 255
    for i in range(h):
    for j in range(w):
    if image[i,j] == 0:
    for k in range(5):
    for l in range(5):
    if -1<(i-2+k)<h and -1<(j-2+l)<w:
    iExpand[i
    -2+k,j-2+l] = 0
    return iExpand


    image
    = cv.LoadImage('pic3.jpg',0)
    iTwo
    = Two(image)
    iCorrode
    = Corrode(iTwo)
    iExpand
    = Expand(iTwo)

    cv.ShowImage(
    'image',image)
    cv.ShowImage(
    'iTwo',iTwo)
    cv.ShowImage(
    'iCorrode',iCorrode)
    cv.ShowImage(
    'iExpand',iExpand)
    cv.WaitKey(0)

    看看运行效果吧

    第一幅图是原图的灰度图,第二幅图是对其做了二值处理

    对于二值图像来说,对黑色进行腐蚀与对白色进行膨胀得到的效果是一样的,

    对白色进行腐蚀与对黑色进行膨胀的得到的效果是一样的。当然,你需要像我一样选取一个矩形窗作为移动的框

    我们来验证一下

    我们先将图像反色,再处理。验证了上面的话

    我们来看看更复杂的图像吧

    我们来讲两个概念:开运算和闭运算

    开运算是对图像先腐蚀后膨胀

    闭运算是对图像先膨胀后腐蚀

    在前面的基础上,我们对腐蚀后的图像做膨胀操作得到的就是开运算的结果

    对膨胀后的图像做腐蚀操作得到的就是闭运算的结果

    我们来看看效果

    (例子中的图片,如有版权问题,请作者与我联系,谢谢)

    开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不变

    闭运算能够填平小湖(小孔),弥合小裂缝,而总的位置和形状不变

    不同的窗口对运算结果会有影响

  • 相关阅读:
    C
    C
    你好,欢迎到这里来
    数组专题
    web前端的性能优化
    MornUI 源码阅读笔记
    application tips
    [转]就这样,创建了自己的运行时共享库(RSL)
    [转]glew, glee与 gl glu glut glx glext的区别和关系
    编码相关了解
  • 原文地址:https://www.cnblogs.com/xianglan/p/1921211.html
Copyright © 2011-2022 走看看