(9条消息) OCR预处理:矫正图片中的文本信息(opencv)

1.首先导入工程所需要的三方包,这里需要opencv、numpy、math
import cv2import numpy as npimport math
2.读取图片
img = cv2.imread(file_path)
3.图片去噪
img_c = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
4.处理成灰度图
gray = cv2.cvtColor(img_c, cv2.COLOR_BGR2GRAY)
5.Sobel算子,x方向求梯度,主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。(可以根据需求选择算子)
 sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
6.二值化
ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
7.霍夫直线
    hufu = binary.astype(np.uint8)    lines = cv2.HoughLinesP(hufu, 1, np.pi / 180, 30, minLineLength=40, maxLineGap=100)    # 在图像上展示霍夫直线描出的直线    # for line in lines:    #     cv2.line(img, (line[0][0], line[0][1]), (line[0][2], line[0][3]), (0, 0, 255), 2)
8.求出所有直线斜率,求出众数(考虑误差),这一步会产生个bug,因为这些直线是利用霍夫直线找到的,所以说需要根据实际场景来设置霍夫直线的相关参数,不然会对图片中的线性非常敏感,比如条形码
    k_dict = {}    k = 0        for line in lines:        if line[0][2] - line[0][0] == 0:            continue        print(line[0][3],line[0][1],line[0][2],line[0][0])        k = (line[0][3] - line[0][1]) / (line[0][2] - line[0][0])        # α = atan(k) * 180 / PI        k = math.atan(k) * 180 / np.pi        if len(k_dict.keys()) == 0 :            k_dict[k] = 1        else:            flag = False            for item in k_dict.keys():                if abs(item - k) < 2:                    flag = True                    k_dict[item] += 1                    break            if not flag:                k_dict[k] = 1    must_k_num = 0    must_key = 0    for item in k_dict.keys():        if k_dict[item] > must_k_num:            must_k_num = k_dict[item]            must_key = item    print(must_key)
9.旋转图像,在旋转图像之前需要对图片进行填充防止旋转后边角溢出(这一步可以根据角度和勾股定理来计算精准的填充大小),利用仿射变换来旋转图像
#旋转图像    h, w = img.shape[:2]    add_w = int((((w*w + h*h) ** 0.5) - w)/2)    add_h = int((((w*w + h*h) ** 0.5) - h)/2)    print(add_w,add_h)    img = cv2.copyMakeBorder(img,add_h,add_h,add_w,add_w, cv2.BORDER_CONSTANT,value=[0,0,0])    h, w = img.shape[:2]    center = (w//2, h//2)    M = cv2.getRotationMatrix2D(center, must_key, 1.0)    rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC)    cv2.imwrite(file_path,rotated)    cv2.imshow("rotated", rotated)    cv2.waitKey(0)

全部代码在这!!!!!!

import cv2import numpy as npimport mathdef rotate(file_path):    img = cv2.imread(file_path)    #去噪    img_c = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)    # 灰度图    gray = cv2.cvtColor(img_c, cv2.COLOR_BGR2GRAY)    # cv2.imshow("gray", gray)    # Sobel算子,x方向求梯度,主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。    sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)    # 二值化    ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)    # 霍夫直线    hufu = binary.astype(np.uint8)    lines = cv2.HoughLinesP(hufu, 1, np.pi / 180, 30, minLineLength=40, maxLineGap=100)    # for line in lines:    #     cv2.line(img, (line[0][0], line[0][1]), (line[0][2], line[0][3]), (0, 0, 255), 2)    k_dict = {}    k = 0    #求出所有直线斜率,求出众数(考虑误差)    for line in lines:        if line[0][2] - line[0][0] == 0:            continue        print(line[0][3],line[0][1],line[0][2],line[0][0])        k = (line[0][3] - line[0][1]) / (line[0][2] - line[0][0])        # α = atan(k) * 180 / PI        k = math.atan(k) * 180 / np.pi        if len(k_dict.keys()) == 0 :            k_dict[k] = 1        else:            flag = False            for item in k_dict.keys():                if abs(item - k) < 2:                    flag = True                    k_dict[item] += 1                    break            if not flag:                k_dict[k] = 1    must_k_num = 0    must_key = 0    for item in k_dict.keys():        if k_dict[item] > must_k_num:            must_k_num = k_dict[item]            must_key = item    print(must_key)    #旋转图像    h, w = img.shape[:2]    add_w = int((((w*w + h*h) ** 0.5) - w)/2)    add_h = int((((w*w + h*h) ** 0.5) - h)/2)    print(add_w,add_h)    img = cv2.copyMakeBorder(img,add_h,add_h,add_w,add_w, cv2.BORDER_CONSTANT,value=[0,0,0])    h, w = img.shape[:2]    center = (w//2, h//2)    M = cv2.getRotationMatrix2D(center, must_key, 1.0)    rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC)    cv2.imwrite(file_path,rotated)    cv2.imshow("rotated", rotated)    cv2.waitKey(0)

谢谢大家观看!

(0)

相关推荐