接下来我将详细讲解如何使用Opencv实现倾斜图片转正的攻略。
1. 实现思路
倾斜图片转正的实现思路是将原图进行旋转,使其与水平方向对齐,然后再对旋转后的图像进行裁剪,裁剪出原图的有效区域。Opencv提供了旋转图片的方法和裁剪图片的方法。
2. 示例1:使用Hough变换检测直线倾斜角度
使用Hough变换检测直线倾斜角度是倾斜图片转正的一种常用方法。具体过程如下:
- 读取待处理的图片,并转换为灰度图像。
- 使用Canny边缘检测算法对图像进行边缘检测,得到二值图像。
- 使用Hough变换检测图像中的直线,可以使用
HoughLinesP()
函数实现。 - 对检测到的直线进行筛选,选出倾斜角度最大的直线。
- 计算出倾斜角度,并使用cv2.getRotationMatrix2D()函数获得图像变换矩阵。
- 使用cv2.warpAffine()函数对图像进行旋转变换。
示例代码如下:
import cv2
import numpy as np
img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=100, maxLineGap=10)
max_theta = 0
for line in lines:
x1, y1, x2, y2 = line[0]
theta = abs(np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi)
if theta > max_theta:
max_theta = theta
max_line = line
h, w = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, max_theta, 1.0)
rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
cv2.imwrite('rotated.jpg', rotated)
3. 示例2:使用图像矩计算倾斜角度
使用图像矩计算倾斜角度是另一种常用的倾斜图片转正方法,其主要思路如下:
- 读取待处理的图片。
- 将图像转为灰度图像,并进行二值化处理。
- 对二值图像进行膨胀操作,使图像中的字符更容易连成连通块。
- 使用cv2.findContours()函数提取图像中的所有连通块。
- 遍历所有连通块,计算每个连通块的图像矩,并根据矩计算出倾斜角度。
- 使用cv2.getRotationMatrix2D()函数获得图像变换矩阵。
- 使用cv2.warpAffine()函数对图像进行旋转变换。
示例代码如下:
import cv2
import numpy as np
img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilation = cv2.dilate(thresh, kernel, iterations=1)
contours, _ = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_theta = 0
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
x1, y1 = box[0]
x2, y2 = box[1]
theta = abs(np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi)
if theta > max_theta:
max_theta = theta
max_box = box
h, w = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, max_theta, 1.0)
rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
cv2.imwrite('rotated.jpg', rotated)
经过上述步骤,我们即可实现倾斜图片转正。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv实现倾斜图片转正示例 - Python技术站