之前用Matlab做图像较多,最近准备学习用opencv和python进行图像处理,并就网上的实际案例进行了练手,其中的一篇扫描件切边案例是:opencv之案例实战-扫描件切边。仅当作学习,不喜勿喷!
本文链接:基于OpenCV4.x + Python3.7的文件扫描件切边实践
测试图像两种:(1)边缘整齐+倾斜;(2)边缘添加干扰+倾斜。具体图像如下所示。
1.具体思路
(1)边缘检测后进行孔洞填充,得到初始文件区域(包含其他连通域);
(2)取最大的连通域作为文件区域,此时其他连通域已被过滤去除;
(3)霍夫直线检测,以kmeans方法挑选出4类直线;
(4)4条筛选出的直线求交点,并以此对原图做仿射变换,得到校正后的图像;
(5)用上面的4个交点求仿射变换后的4个新点坐标,并以此切边获得最终结果图像
2.实现过程
2.1 边缘检测+孔洞填充
采用canny边缘检测,该算子以及用法在此不用详述;孔洞填充,opencv和python好像还没有可以直接用的函数(可能我还没发现,可以补充),孔洞填充函数如下,其中用到了cv.floodFill自带函数。(fillimg()是借鉴别人的,链接不知道了,下次碰见附上链接):
import cv2 as cv
import numpy as np
def fillimg(img):
img1 = img.copy()
h,w = img.shape[:2]
mask = np.zeros((h+2,w+2),np.uint8)
cv.floodFill(img1,mask,(0,0),255)
img2 = cv.bitwise_not(img1) #取反
out = img|img2 # 或操作
return out
该过程实现如下:
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edge = cv.Canny(gray,th,2*th) #canny边缘检测
ele = cv.getStructuringE