Python下opencv使用笔记(六)(图像的形态学转换)

  • 形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建等等。常用的形态学操作时腐蚀与膨胀,在他们的基础上演变出一些变体,包括开运算、闭运算、梯度等等。形态学一般是对二值图像进行的操作。

  • 下面贴几个比较好的介绍图像形态学方面的博客
    图像处理基本算法-形态学
    图像的形态学处理

(一)腐蚀

关于腐蚀就是将图像的边界腐蚀掉,或者说使得图像整体上看起来变瘦了。它的操作原理就是卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素保持原来的值,否则就变为0。这对于去除白噪声很有用,也可以用于断开两个连载一起的物体。一个例子如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,1)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(erosion,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第1张图片

(二)膨胀

膨胀原理与腐蚀相同,只不过膨胀的时候与卷积核对应的原图像的像素值只要有一个为1,那么中心元素就是1。这么做带来的变化就是图像膨胀了,或者说图像变胖了。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
erosion = cv2.dilate(img,kernel,1)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(erosion,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第2张图片

(三)开运算

先进行腐蚀再进行膨胀的运算就是开运算,腐蚀可以让那些在图像外面的小点点去掉,然后把主图像膨胀回去,实现去除图像外噪声。这里为了测试,将图像改一改,内外都加点白点试试:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man1.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
erosion = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(erosion,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第3张图片

可以看到,外面的白点去点了,但是图像里面的白点似乎还在,多多少少影响着图形。

(四)闭运算

先进行膨胀再进行腐蚀的运算就是闭运算,膨胀可以让那些在图像里面的小点点去掉,然后把主图像腐蚀回去,实现去除图像内噪声。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man1.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
erosion = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(erosion,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第4张图片

(五)形态学梯度

膨胀与腐蚀的组合使用,使得结果看上去是提取了物体的轮廓一样。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
closing= cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(closing,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第5张图片

(六)礼帽

原始图像与其进行开运算后的图像进行一个差。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
closing= cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(closing,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第6张图片

(七)黑帽

原始图像与其进行闭运算后的图像进行一个差。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('man.jpg',0) #直接读为灰度图像

kernel = np.ones((5,5),np.uint8)
closing= cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(closing,'gray')

Python下opencv使用笔记(六)(图像的形态学转换)_第7张图片
从运算上讲是这样的,但是这个图下礼帽与黑帽的结果并不是很明显。

你可能感兴趣的:(python,opencv,图像处理)