59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
|
# -*- 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()
|