前言

    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

大家好,我是海浪学长,本次分享的课题是

🎯基于机器学习的图片处理图片倾斜校正

课题背景和意义

在日常生活中我们拍摄图像通常会因为相机的焦距变化、角度形变等多种复杂的原因,导致图像产生几何畸变,从而影响OCR(光学字符识别),也就是文字识别效果,日常生活中我们通过使用手机或者是一些软件就可以实现对畸变图像进行矫正。

实现技术思路

图像矫正主要为图像预处理及图像矫正二个步骤,其中图像预处理又可细分为图像灰度化处理、阈值分割、轮廓查找等多个操作流程。

图像灰度化处理

灰度图像概念:

由彩色图像转化为灰度图像的操作被称为图像灰度化。在我们日常生活中,相机拍照、屏幕截取等操作所生成的图像均为BGR三通道的彩色图像。而对于BGR图像而言,当图像B、G、R三个通道像素值相同时即为灰度图像。

转换灰度图像的意义:

1)相较于彩色图像而言,灰度图像所占内存更小,运算速度更快;

2)将图像转化为灰度图像后可以在视觉上增加对比,突出我们目标区域。

img_path = "text.jpg"img = cv2.imread(img_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

图像二进制阈值分割

二进制阈值化概念:

指将大于阀值的像素点设置为最大值,而小于阀值的像素点设置为0。此处为更准确地获取图像轮廓,我们通常会将图像分为待矫正物体及背景两个部分,待矫正物体为阈值化为最大像素值区域,背景区域为阈值化为0像素值区域。

二进制阈值分割图像的意义:

获取图像掩膜,保证图像轮廓查找的准确度

# flip the foreground and background to ensure text is "white"gray = cv2.bitwise_not(gray)
blur = cv2.GaussianBlur(gray, (7,7), 0)# setting all foreground pixels to 255 and all background pixels to 0ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

图像轮廓查找

轮廓概念:

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义。

查找图像轮廓意义:

查找待矫正区域位置坐标,我们可以以此为基准进行进一步矫正操作

whereid = np.where(thresh > 0)# 交换横纵坐标的顺序,否则下面得到的每个像素点为(y,x)whereid = whereid[::-1]# 将像素点格式转换为(n_coords, 2),每个点表示为(x,y)coords = np.column_stack(whereid)

获取待矫正区域位置及旋转信息

获取待矫正区域位置信息:

主要是获取待矫正区域外接矩形的中心点坐标及其四个顶点坐标,方便坐标迁移

获取待矫正区域旋转角度:

以图像待矫正区域外接矩形中心坐标位置为坐标原点做平面直角坐标系,图像待矫正区域外接矩形长边与平面直角坐标系的夹角就为图像待矫正区域旋转角度

(x,y), (w,h), angle = cv2.minAreaRect(coords)if angle < -45:
    angle = 90 + angle

图像矫正

图像矫正操作是以图像中心点为旋转中心,以图像旋转角度为基准对图像进行逆时针旋转,使图像实现倾斜矫正

vis = img.copy()box = cv2.boxPoints(((x,y), (w,h), angle))box = np.int0(box)cv2.drawContours(vis,[box],0,(0,0,255),2)

实现效果图样例

文档图像 倾斜矫正 python_文档图像 倾斜矫正 python

文档图像 倾斜矫正 python_深度学习_02