一种基于OpenCV的图片倾斜矫正方法

需求描述:

对倾斜的图片进行矫正,返回倾斜角度和矫正后的图片。

解决方法:

1、各种角度点被投影到一个累加器阵列中,其中倾斜角度可以定义为在最大化对齐的搜索间隔内的投影角度。

2、以不同的角度旋转图像,并为每次迭代生成像素的直方图。

3、为了确定倾斜角度,比较峰值之间的最大差异,并使用这个倾斜角度,旋转图像来纠正倾斜。

python 复制代码
#coding=utf-8
import cv2
import numpy as np

def rotate_image(image, angle):
    (h, w) = image.shape[: 2]
    center = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    corrected = cv2.warpAffine(image, M, (w, h), flags = cv2.INTER_CUBIC, \
        borderMode = cv2.BORDER_REPLICATE)
    return corrected

def determine_score(arr):
     histogram = np.sum(arr, axis = 2, dtype = float)
     score = np.sum((histogram[..., 1 :] - histogram[..., : -1]) ** 2, \
        axis = 1, dtype = float)
     return score

def correct_skew(image, delta = 0.1, limit = 5):
     thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + \
        cv2.THRESH_OTSU)[1]
     angles = np.arange(-limit, limit + delta, delta)
     img_stack = np.stack([rotate_image(thresh, angle) for angle \
        in angles], axis = 0)
     scores = determine_score(img_stack)
     best_angle = angles[np.argmax(scores)]
     corrected = rotate_image(image, best_angle)
     return best_angle, corrected
if __name__ == "__main__":
    file_path=r'D:/_21.png'
    img = cv2.imread(file_path, 0)
    angle, corrected = correct_skew(img)
    print(angle)
    cv2.imwrite(r'D:/temp_' + file_path.split('/')[-1], corrected)

执行结果:

矫正前:

矫正后:

相关推荐
MOS管-冠华伟业3 分钟前
MOSFET采购选型指南:微硕半导体全系解决方案
大数据·人工智能
kaikaile199517 分钟前
能量算子的MATLAB实现与详细算法
人工智能·算法·matlab
小布的学习手记22 分钟前
教AI读小说:把《时光机器》变成一串数字的奇妙旅程
人工智能
就是有点傻25 分钟前
机器视觉图像处理学习第一天
人工智能·计算机视觉
Aaron158825 分钟前
数字波束合成DBF与模拟波束合成ABF对比浅析
大数据·人工智能·算法·硬件架构·硬件工程·信息与通信·信号处理
MRDONG126 分钟前
Prompt 到 Context 再到 Harness:AI 工程范式的三次跃迁
人工智能·语言模型·prompt
weixin_4080996728 分钟前
【实战案例】电商自动化:如何用 OCR API 批量识别商品图片文字?(完整方案 + 代码示例)
人工智能·ocr·api·文字识别·电商ocr·商品图片文字识别·ocr 批量识别
非晓为骁29 分钟前
我用AI给自己做了一场深度复盘
人工智能·ai·复盘
新缸中之脑29 分钟前
如何让AI推荐你
人工智能
AI帮小忙31 分钟前
OpenClaw 清除对话记录 & 常用命令速查手册
人工智能