用膨胀腐蚀方法实现
(1)如下图片的表格线提取(2)如下图片的字母A提取
(1)图片的表格线提取
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读入图片
alphabeta = cv2.imread("pic/alphabeta.png", 0)
#显示图片
plt.imshow(alphabeta)
#表格线提取
kernel = np.ones((1,100), np.uint8)
close1 = cv2.erode(cv2.dilate(alphabeta, kernel, iterations = 1), kernel, iterations = 1)
cv2.imshow("close", close1)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)图片的字母A提取
#1.通过图像阈值转换高亮标注字母
ret,close2 = cv2.threshold(alphabeta, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("close", close2)
cv2.waitKey(0)
cv2.destroyAllWindows()
#2.提取字母A大小的矩阵块作为核
kernel = close2[160:280,100:210];
print(type(kernel))
print(kernel.shape)
cv2.imshow("kernel", kernel)
cv2.waitKey(0)
cv2.destroyAllWindows()
#3.对字母表进行腐蚀操作
open1 = cv2.erode(close2, kernel, iterations = 1)
cv2.imshow("open", open1)
cv2.waitKey(0)
cv2.destroyAllWindows()
#4.对字母表进行开运算,先腐蚀,后膨胀
open1 = cv2.dilate(cv2.erode(close2, kernel, iterations = 1), kernel, iterations = 1)
cv2.imshow("open", open1)
cv2.waitKey(0)
cv2.destroyAllWindows()
#5.提取字母Aa大小的矩阵块作为核
kernel = close2[160:280,100:280];
print(type(kernel))
print(kernel.shape)
cv2.imshow("kernel", kernel)
cv2.waitKey(0)
cv2.destroyAllWindows()
open1 = cv2.dilate(cv2.erode(close2, kernel, iterations = 1), kernel, iterations = 1)
cv2.imshow("open", open1)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作
close2 = cv2.erode(close2, kernel, iterations = 1)
#旋转内核
rows,cols = kernel.shape[:2]
M = cv2.getRotationMatrix2D((cols/2,rows/2),180,1)
kernel = cv2.warpAffine(kernel,M,(cols,rows))
cv2.imshow("kernel", kernel)
cv2.waitKey(0)
cv2.destroyAllWindows()
#膨胀操作
open1 = cv2.dilate(close2, kernel, iterations = 1)
cv2.imshow("open", open1)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论:进行腐蚀和膨胀的对象的像素值要大于零,对原图进行操作时得到的是全白的图片,开运算的到的目标区域会旋转180度,在进行腐蚀操作后需要对内核进行旋转180度得到原始目标区域图像