天天看点

cv2——状态学转换

# coding: utf-8 
# !/usr/bin/python
"""
@File       :   形态学转换.py
@Author     :   jiaming
@Modify Time:   2020/2/2 13:49    
@Contact    :   
@Version    :   1.0
@Desciption :   腐蚀、膨胀、开运算、闭运算
            cv2.erode() cv2.dilate() cv2.morphologyEx()
            形态学操作是根据图像进行的简单操作。一般情况下对二值化图像进行的操作。需要输入
            两个参数,一个是原始图像,第二个被称为结构化元素或核
"""
import os
import sys
import numpy as np
import cv2
import pprint
from matplotlib import pyplot as plt

rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'      

1.腐蚀

"""
1.腐蚀
将前景物体的边界腐蚀掉,但是前景仍然是白色
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则
就保持原来的像素值,否则就变为零。
这会产生什么影响?
根据卷积核的大小靠近前景的所有像素都会被腐蚀掉。所以前景物体会变小,整幅图像的白色区域会减少。这对于去除
白噪声很有用,也可以用来断开两个连接在一起的物体等。
"""
# 1.导入图片
img = cv2.imread(dataPath+'j.png', 0)
# 2.创建腐蚀使用的内核
kernel = np.ones((5, 5), np.uint8)
# 3.执行腐蚀操作
erode = cv2.erode(img, kernel)
# 4.显示腐蚀操作过程图片
cv2.imshow("img", img)
cv2.imshow("erode", erode)
cv2.waitKey(0)
cv2.destroyAllWindows()      
cv2——状态学转换
cv2——状态学转换
cv2——状态学转换

2.膨胀

"""
膨胀
与腐蚀相反,与卷积核对应的原像素的像素值中只要有一个是1,中心元素的像素值就是1。
所以这个操作会增加图像中的白色区域(前景)
一般在去噪声时先用腐蚀再膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。
膨胀也可以用来连接两个分开的物体。
"""
img = cv2.imread(dataPath+'j.png', 0)
kernel = np.ones((5, 5), np.uint8)
new = cv2.dilate(img, kernel, iterations=1)
cv2.imshow("img", img)
cv2.imshow("new", new)
cv2.waitKey(0)
cv2.destroyAllWindows()      
cv2——状态学转换

3.开运算

"""
开运算
先进性腐蚀再膨胀叫做开运算。
"""
img = cv2.imread(dataPath+'j_.png', 0)
kernel = np.ones((5, 5), np.uint8)
new = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow("img", img)
cv2.imshow("new", new)
cv2.waitKey(0)
cv2.destroyAllWindows()      
cv2——状态学转换

4.闭运算

"""
闭运算
先膨胀再腐蚀。它经常被用来填充前景物体的小洞,或者前景物体上的小黑点。
"""
img = cv2.imread(dataPath+'_j.png', 0)
kernel = np.ones((5, 5), np.uint8)
new = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow("img", img)
cv2.imshow("new", new) 
cv2.waitKey(0)
cv2.destroyAllWindows()      
cv2——状态学转换

5.形态学梯度

"""
形态学梯度
其实就是一幅图像膨胀与腐蚀的差别
结果看上去就像是前景物体的轮廓
"""
img = cv2.imread(dataPath+'j.png', 0)
kernel = np.ones((5, 5), np.uint8)
new = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("img", img)
cv2.imshow("new", new)
cv2.waitKey(0)
cv2.destroyAllWindows()      
cv2——状态学转换

6.礼帽

"""
礼帽
原始图像与进行开运算之后得到的图像的差
"""
img = cv2.imread(dataPath+'j__.png', 0)
kernel = np.ones((11, 11), np.uint8)
new = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow("img", img)
cv2.imshow("new", new)
cv2.waitKey(0)
cv2.destroyAllWindows()      

7.黑帽

"""
黑帽
进行闭运算之后得到的图像与原始图像的差
"""
img = cv2.imread(dataPath+'j__.png', 0)
kernel = np.ones((7, 7), np.uint8)
new = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("img", img)
cv2.imshow("new", new)

cv2.waitKey(0)
cv2.destroyAllWindows()      

继续阅读