如何通过图像处理将图片中的非水平和竖直线条变得水平和竖直给出python代码
时间: 2024-03-28 21:41:03 浏览: 50
以下是使用Python和OpenCV库实现将图片中的非水平和竖直线条变得水平和竖直的示例代码:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('input_image.jpg')
# 灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray,50,150,apertureSize = 3)
# 检测直线
lines = cv2.HoughLines(edges,1,np.pi/180,200)
# 计算直线角度
angles = []
for line in lines:
for rho,theta in line:
if (theta < (np.pi/4.)) or (theta > (3.*np.pi/4.0)):
# 垂直线
angle = np.degrees(theta) - 90.0
else:
# 水平线
angle = np.degrees(theta)
angles.append(angle)
# 计算旋转角度
median_angle = np.median(angles)
print("旋转角度:", median_angle)
# 旋转图像
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 先将图像旋转90度
(h, w) = rotated.shape[:2]
center = (w / 2, h / 2)
M = cv2.getRotationMatrix2D(center, -median_angle, 1.0)
rotated = cv2.warpAffine(rotated, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
# 修剪图像
gray = cv2.cvtColor(rotated,cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,1,255,cv2.THRESH_BINARY)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
result = rotated[y:y+h,x:x+w]
# 显示结果
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码首先读取输入图像,然后将其灰度化并进行边缘检测。接下来使用霍夫变换检测直线,并计算每条直线的角度。通过计算所有直线角度的中位数,确定图像需要旋转的角度,然后使用OpenCV中提供的旋转函数将图像旋转到正确的角度。最后,使用轮廓检测函数找到旋转后的图像的边界框,并将其修剪以去除空白区域。最终,程序将旋转并修剪后的图像显示在屏幕上。
阅读全文