形态学

发布时间 2023-04-12 15:24:49作者: idazhi

形态学

什么是形态学处理

​ 基于图像形态进行处理的一些基本方法

​ 这些处理方法基本是对二进制图像进行处理

​ 卷积核决定着图像处理后的效果

腐蚀与膨胀

​ 腐蚀:将一个区域变小

​ 膨胀:将一个区域变大

开运算

​ 先做腐蚀在做膨胀

闭运算

​ 先做膨胀在做腐蚀

顶帽

黑帽

图像的二值化

​ 将图像的每个像素变成两种值,如0,255

全局二值化

​ 画一条线进行对比,低于这条线变为最小值0,高于这条线变为最大值255

局部二值化

​ 将图分很多小块,在这个小块中做二值化

全局二值化

###threshold(img,thresh,maxVal,type)
	img图像,最好是灰度图
	thresh 阈值 画一条线 低于变最小值 高于变最大值
	maxVal 超过阈值 替换成maxVal
	 
import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-4113ee2870ecf076.jpg')

###转为灰度图 
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

### ret执行结果 dst 输出的图像
ret,dst = cv2.threshold(img1,180,255,cv2.THRESH_BINARY)
###THRESH_BINARY_INV相反的结果 把白色变为黑色 黑变为白
ret,dst1 = cv2.threshold(img1,180,255,cv2.THRESH_BINARY_INV)

cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('bin',dst)
cv2.imshow('bi1',dst1)

cv2.waitKey(0)

自适应阈值

由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化成黑色

###使用带阴影的图进行全局二值化会出现阴影部分变为全白或全黑使用自适应阈值可以解决这个问题
 

adaptiveThreshold(img,maxVal,adaptiveMethod type,blockSize,C)
	adaptiveMethod:计算阈值的方法,可对某一个区域自己计算阈值 调整blockSize
	blockSize 邻近区域的大小
	C 常量,应从计算出的平均值或加权平均值中减去
	
import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\shuzi.png')

###转为灰度图 
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

### ret执行结果 dst 输出的图像 3:3X3 THRESH_BINARY:底色黑色
dst = cv2.adaptiveThreshold(img1,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                cv2.THRESH_BINARY_INV,3,0)


cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('bin',dst)


cv2.waitKey(0)

腐蚀

erode(img,kernel,iterations=1)
	kernel:卷积核,卷积核越大腐蚀的越明显
	iterations=1:腐蚀的次数

import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-4113ee2870ecf076.jpg')

kernel = np.ones((7,7),np.uint8)
dst = cv2.erode(img,kernel,iterations=1)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

获取卷积核

getStructuringElement(type,size)
	size值为:(3,3),(5,5)....

###卷积核类型
	MORPH_RECT:矩形 全1的
	MORPH_ELLIPSE:椭圆形的四个角会变为0
	MORPH_CROSS:交叉 类似十字架 横竖 其他全为0
	####矩形 椭圆 十字架形分别对图像处理的结果不同,
	
	
import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-4113ee2870ecf076.jpg')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

print(kernel)

###椭圆形的
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print(kernel2)

dst = cv2.erode(img,kernel,iterations=1)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)
	
	
-----
MORPH_RECT:结果
[[1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]]
MORPH_ELLIPSE:结果
[[0 0 1 0 0]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [0 0 1 0 0]]

膨胀

dilate(img,kernel,iterations=1)
	kernel:卷积核大小决定膨胀速度 越大膨胀速度越大
	
import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-4113ee2870ecf076.jpg')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# print(kernel)
####膨胀
dst = cv2.dilate(img,kernel,iterations=1)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

开运算

开运算= 腐蚀+膨胀 顺序不可颠倒 去除大图形外的小图形
###可用于去噪点

import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\kaiyunsuan.png')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))

# print(kernel)
####膨胀
dst = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

闭运算

闭运算= 膨胀 + 腐蚀
###字符里面有很多噪点 可以把里面噪点去除掉,开运算是可以把外面去除掉
###去除大图形内的小图形

import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-biyunsuan.png')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))

# print(kernel)
####闭运算
dst = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

形态学梯度

梯度= 原图 - 腐蚀
###可用于求边缘

import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-biyunsuan.png')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))

# print(kernel)

dst = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

顶帽运算

顶帽= 原图-开运算  得到大图形外的小图形
import cv2 
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-ding.png')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(19,19))

# print(kernel)

dst = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

xingtai-10

黑帽运算

黑帽 = 原图- 闭运算  得到大图形内的小图形

import cv2
import numpy as np

img = cv2.imread('C:\\Users\dazhi\Desktop\-biyunsuan.png')

# kernel = np.ones((7,7),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))

# print(kernel)

dst = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)

xingtai-11