# -*- coding: utf-8 -*- # @Time : 2024/3/12 21:03 # @Author : len # @File : QR矫正.py # @Software: PyCharm # @Comment : import cv2 import numpy as np from matplotlib import pyplot as plt # 读取原图 srcImagePath = r"./android_img/test/img_1.png" srcImage = cv2.imread(srcImagePath) srcImage = cv2.resize(srcImage, (500, 500)) # 调整图像大小 # 调整亮度和对比度 alpha = 1.8 # 对比度因子 beta = -30 # 亮度因子 contrastImage = cv2.convertScaleAbs(srcImage, alpha=alpha, beta=beta) # 转换为灰度图 grayImage = cv2.cvtColor(contrastImage, cv2.COLOR_BGR2GRAY) # 双边滤波 filterImage = cv2.bilateralFilter(grayImage, 13, 26, 6) # 二值化 _, binaryImage = cv2.threshold(filterImage, 210, 255, cv2.THRESH_BINARY_INV) # 腐蚀 erodeImage = cv2.erode(binaryImage, None, iterations=2) # 膨胀 dilateImage = cv2.dilate(erodeImage, None, iterations=19) # Canny边缘检测 cannyImage = cv2.Canny(dilateImage, 10, 100) # Hough变换检测直线 lines = cv2.HoughLines(cannyImage, 5, np.pi/180, 100) # 直线简化逻辑(这里简化为展示所有检测到的直线) if lines is not None: for line in lines: rho, theta = line[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)) cv2.line(srcImage, (x1, y1), (x2, y2), (0, 0, 255), 2) plt.imshow(cv2.cvtColor(srcImage, cv2.COLOR_BGR2RGB)) plt.title('Detected Lines') plt.show()