python图形-检测书法文字(结合前面的方法)

步骤:

1.读取图片、灰度、二值化处理

2.侵蚀去噪点

3.膨胀连接

4.闭合孔洞

5.边缘检测

6.画检测框

 

1.读取图片,灰度处理,二值化处理

代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
plt.rcParams['figure.dpi'] = 200

img = cv2.imread('./shufa.png')

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

plt.imshow(gray,cmap='gray')

得到(plt.rcParams['figure.dpi'] = 200代码的目的:把输出图片变大):

 再进行二值化处理:

代码:

# 二值化 “非此即彼”
# 四个参数,第一个是输入的灰度图,第二个是比较的阈值,第三个是超出阈值被设定的值,第四个:模式
# 灰度图,像素值都是0-255,越接近255,画面越白,越接近0,画面越黑,所以这些黑色的字,像素值非常小,后面灰色的背景,像素值接近255
# 小于100:即阈值设置为100,如果该点像素值小于100,变为0,如果该点像素值超过100,咱们第三个参数设置的是255,则超过100的就设置为255(白色)
r,black_img = cv2.threshold(gray,100,255,cv2.THRESH_BINARY) # 如果想反转颜色,最后参数变为:THRESH_BINARY_INV
plt.imshow(black_img,cmap='gray')

得到(仔细看注释!):

 

2.边缘检测

代码:

# 边缘检测
edges = cv2.Canny(black_img,30,200)
plt.imshow(edges,cmap='gray')

得到:

 继续代码:

# 找轮廓
coutours,h = cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

img_copy = img.copy()
for c in coutours:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(img_copy,(x,y),(x+w,y+h),(0,255,0),3)

plt.imshow(img_copy)

得到:

 

3.侵蚀去噪点

代码:

# 先侵蚀,去除噪点
kernel = np.ones((3,3),dtype=np.int8)
erosion1 = cv2.erode(black_img,kernel,iterations = 1)

plt.imshow(erosion1,cmap = 'gray')

得到:

 

4.再膨胀

# 再膨胀
kernel = np.ones((1,1),dtype = np.int8)
dilation = cv2.dilate(erosion1,kernel,iterations=2)
plt.imshow(dilation,cmap='gray')

得到:

 

 5:闭合(把孔洞融合起来)(并且画面变的很干净)

二值化->侵蚀->膨胀->闭合(把字变成一团一团的字)->这个时候做 字的轮廓边缘检测,基本上达到效果

# 闭合
kernel = np.ones((10,10),dtype = np.int8)
closing = cv2.morphologyEx(dilation,cv2.MORPH_CLOSE,kernel)
plt.imshow(closing,cmap='gray')

得到:

 

 6:边缘检测

# 边缘检测
edges1 = cv2.Canny(closing,30,200)
plt.imshow(edges1,cmap='gray')

得到:

 

 7:找轮廓

# 找轮廓
coutours1,h = cv2.findContours(edges1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

img_copy = img.copy()
for c in coutours1:
    x,y,w,h = cv2.boundingRect(c)
    if w > 70:
        cv2.rectangle(img_copy,(x,y),(x+w,y+h),(0,255,0),3)
plt.imshow(img_copy)

得到:

 

总结:多加练习,先熟练,再深化。

在2步(第一次进行边缘检测)的时候,为啥会出现很多矩形呢?因为这些字中间有空隙,我们想着把这些合成一个部分(各个笔画之间形成一个整体的字)。先用形态学的侵蚀,把噪点去掉;再膨胀,把字还原回来,多次膨胀,让字的主体更加饱满,为后面的闭合做准备;再闭合,让主体变成一团;最后进行边缘检测,就会将一整个字体框选出来。

posted @ 2023-07-11 09:18  沉梦昂志_doc  阅读(154)  评论(0编辑  收藏  举报