目 录
一、思路
二、代码
三、效果
参考 https://blog.csdn.net/weixin_42259833/article/details/124398342
一、思路
因为黑色背景且旋转图片为矩形,找最长直线,计算直线角度,图片旋转,去掉多余黑色区域。
二、代码
import cv2
import numpy as np
import mathdef get_long_line(img):C = cv2.Canny(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), 10, 200, apertureSize=3) # 边缘检测 #10lines = cv2.HoughLines(C, 1, np.pi / 180, 20) # 直线检测# 滤波img = cv2.blur(img, (3, 3)) # 5,5img = cv2.medianBlur(img, 5)for line in lines:rho = line[0][0] # 第一个元素是距离rhotheta = line[0][1] # 第二个元素是角度thetaif (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线pt1 = (int(rho / np.cos(theta)) + 490, 0 + 372) # 该直线与第一行的交点# 该直线与最后一行的焦点pt2 = (int((rho - img.shape[0] * np.sin(theta)) / np.cos(theta)) + 490, img.shape[0] + 372)else: # 水平直线pt1 = (0, int(rho / np.sin(theta))) # 该直线与第一列的交点# 该直线与最后一列的交点pt2 = (img.shape[1], int((rho - img.shape[1] * np.cos(theta)) / np.sin(theta)))return (pt1, pt2)pass# 读取照片
L = cv2.imread('3.png') # queryImage
# 高斯滤波
L = cv2.GaussianBlur(L, (3, 3), 1)
#获取最长直线
pt1, pt2 = get_long_line(L)
angle = 90-math.degrees(math.atan2(pt2[0]-pt1[0], pt2[1]-pt1[1]))
#图片旋转
rows,cols=L.shape[:2]
rotation_matrix=cv2.getRotationMatrix2D((cols//2,rows//2),angle,1)
image_rotation_0=cv2.warpAffine(L,rotation_matrix,(cols,rows))
# 得到新的位置
rows, cols = np.where(image_rotation_0[:, :, 0] != 0)
min_row, max_row = min(rows)+1, max(rows)-1
min_col, max_col = min(cols)+1, max(cols)-1
# 去除黑色无用部分
image_rotation_0 = image_rotation_0[min_row:max_row, min_col:max_col, :]#图片显示
cv2.line(L, pt1, pt2,(0,0,255) , 2) # 绘制一条蓝线
cv2.imshow('a',L)
cv2.imshow('B',image_rotation_0)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、效果
*原图的最长直线
*校正后效果