【发布时间】:2021-12-31 21:37:10
【问题描述】:
我有这张树线作物的图像。我需要找到作物对齐的大致方向。我正在尝试获取图像的霍夫线,然后找到角度的分布模式。
我一直在关注this tutorial的裁剪线,但是在那一个中,裁剪线很稀疏。在这里,它们是密集的,经过灰度化、模糊化和使用精明的边缘检测,这就是我得到的
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('drive/MyDrive/tree/sample.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gauss = cv2.GaussianBlur(gray, (3,3), 3)
plt.figure(figsize=(15,15))
plt.subplot(1,2,1)
plt.imshow(gauss)
gscale = cv2.Canny(gauss, 80, 140)
plt.subplot(1,2,2)
plt.imshow(gscale)
plt.show()
(左侧没有canny的模糊图像,留下一张经过canny预处理的图像)
之后,我按照教程,将预处理后的图像“骨架化”
size = np.size(gscale)
skel = np.zeros(gscale.shape, np.uint8)
ret, gscale = cv2.threshold(gscale, 128, 255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
done = False
while not done:
eroded = cv2.erode(gscale, element)
temp = cv2.dilate(eroded, element)
temp = cv2.subtract(gscale, temp)
skel = cv2.bitwise_or(skel, temp)
gscale = eroded.copy()
zeros = size - cv2.countNonZero(gscale)
if zeros==size:
done = True
给我
如您所见,仍然有一堆曲线。在上面使用HoughLines算法时,有11k条线散布在各处
lines = cv2.HoughLinesP(skel,1,np.pi/180,130)
a,b,c = lines.shape
for i in range(a):
rho = lines[i][0][0]
theta = lines[i][0][1]
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(img,(x1,y1),(x2,y2),(0,0,255),2, cv2.LINE_AA)#showing the results:
plt.figure(figsize=(15,15))
plt.subplot(121)#OpenCV reads images as BGR, this corrects so it is displayed as RGB
plt.plot()
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Row Detection')
plt.xticks([])
plt.yticks([])
plt.subplot(122)
plt.plot()
plt.imshow(skel,cmap='gray')
plt.title('Skeletal Image')
plt.xticks([])
plt.yticks([])
plt.show()
我是 cv2 的新手,所以我不知道该怎么做。搜索并尝试了一堆东西,但没有一个有效。如何去除稍微大一点的点,去除弯曲的线条?
【问题讨论】:
-
嘿,这可以说是图像处理问题而不是编程问题。如果您在这里没有找到答案,可以将问题转移到signals.stackexchange.com :)
-
看起来傅里叶变换在这里可能有用。
-
你可以试试索贝尔角的中位数
-
@mozway 我知道傅立叶变换是什么,但我不知道它有什么帮助,你能解释一下吗?
-
@Micka 我会想办法解决的
标签: python numpy opencv hough-transform