先上代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#coco
#图片旋转纠正处理(二)
#没办法拍摄拍摄不水平的歪斜图片
import cv2
import math
import imageio
import numpy as np
from scipy import misc, ndimage
if __name__ == '__main__':
img_path = 'E:/project/Template_detection/Image_preprocessing/shiti.jpg'
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.Canny(src, thresh1, thresh2) 进行canny边缘检测
# src表示输入的图片,
#thresh1表示最小阈值,
#thresh2表示最大阈值,用于进一步删选边缘信息
#例如:50,70 梯度像素>70: 强边缘像素;50<梯度像素<70:弱边缘像素; 梯度像素<50:被抑制
#apertureSize 指边缘检测器的大小。canny使用非极大值抑制的方法来判断弱边缘像素是不是该图像的边缘信息。
# 这个方法使得canny不像sobel算法一样,使得canny对于图像的边缘信息定位准确,而又不像laplacian算子那样对图像的噪声十分敏感。
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# 霍夫变换
#rho = x cos (theta) + y sin (theta)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 0)
rotate_angle = 0
for rho, theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
if x1 == x2 or y1 == y2:
continue
t = float(y2 - y1) / (x2 - x1)
rotate_angle = math.degrees(math.atan(t))
if rotate_angle > 45:
rotate_angle = -90 + rotate_angle
elif rotate_angle < -45:
rotate_angle = 90 + rotate_angle
print("rotate_angle : " + str(rotate_angle))
rotate_img = ndimage.rotate(img, rotate_angle)
imageio.imsave('ssss.png', rotate_img)
cv2.imshow("img", rotate_img)
cv2.waitKey(0)
这个代码可以实现图片歪斜纠正:
这两种图片都可以实现旋转。但是不能实现镜头不水平拍摄造成的扭曲,举个栗子:
这种图片就不能正确旋转。
ps:越学越难。。。加油!