1 实例:字母提取
步骤:
1.获取图片
2.对图片降低噪声,模糊处理(均值模糊,高斯模糊等)
3.设置结构元并对图片进行形态学处理(开、闭运算)
4.对各个字母进行轮廓提取
5.对轮廓提取后的字母进行边界分割
具体代码实现:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
def show(img):
if img.ndim==2:
plt.imshow(img,cmap='gray')
else:
img2=cv.cvtColor(img,cv.COLOR_BGR2RGB)
plt.imshow(img2)
plt.show()
1.获取图片
2.对图片降低噪声,模糊处理(均值模糊,高斯模糊等)
img=cv.imread("pic/word_family.jpg")
show(img)
img=cv.blur(img,(3,3))#均值滤波
show(img)
3.用颜色范围进行获取各字母掩膜,设置结构元并对图片进行形态学处理(开、闭运算)
d = 20
colors = np.array([ # b, g, r
[161, 1, 251],
[0, 224, 243],
[108, 153, 0],
[248, 209, 0],
[225, 84, 117],
[26, 56, 103],
])
#mask=cv.inRange(img,colors[0]-d,colors[0]+d)
masks=[cv.inRange(img,c-d,c+d) for c in colors]
K=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
masks=[cv.morphologyEx(mask,cv.MORPH_OPEN,K) for mask in masks]
masks=[cv.morphologyEx(mask,cv.MORPH_CLOSE,K) for mask in masks]
4.对各个字母进行轮廓提取
5.对轮廓提取后的字母进行边界分割
words=[]
for m in masks:
show(m)
cnts,hiers=cv.findContours(m,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
for cnt in cnts:
print(cv.contourArea(cnt))
if cv.contourArea(cnt)>500:
x,y,w,h=cv.boundingRect(cnt)
word=m[y:y+h,x:x+w]
words.append(word)
for word in words:
show(word)
效果: