资源简介
倾斜图像霍夫变换旋转,并进行识别特定区域进行裁剪
代码片段和文件信息
import os
import cv2
import math
import random
import numpy as np
from scipy import misc ndimage
import matplotlib.pyplot as plt
img = cv2.imread(‘D:/2.jpg‘)
#图片路径
gray = cv2.cvtColor(img cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray 50 150 apertureSize=3)
# 霍夫变换将图片所在的直角坐标系中具有形状的曲线或直线映射到霍夫空间的一个点上形成峰值,
# 从而将检测任意形状的问题转化成了计算峰值的问题即在图片所在的直角坐标系的一个直线
# 转换到霍夫空间便成了一点,并且是由多条直线相交而成,我们统计的峰值也就是该相交点的橡胶线的条数
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)
cv2.imshow(“img“ rotate_img)
cv2.imwrite(“new.jpg“ rotate_img)
cv2.waitKey(0)
image = cv2.imread(“new.jpg“)
gray = cv2.cvtColor(image cv2.COLOR_BGR2GRAY)
#用Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域。
gradX = cv2.Sobel(gray cv2.CV_32F dx=1 dy=0 ksize=-1)
gradY = cv2.Sobel(gray cv2.CV_32F dx=0 dy=1 ksize=-1)
gradient = cv2.subtract(gradX gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imshow(“first“ gradient)
cv2.waitKey()
#
评论
共有 条评论