在图像中仅显示 45 度线
Display only 45 degrees line in an image
我想检测图像中仅与原点成 45 度角的线条。我必须只用 3x3 卷积来做。我已经解决了它,所有 45 度角的线都被删除,其他一切都保留下来(与我想要的相反)。从这里达到我的最终目标的任何帮助将不胜感激,谢谢。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Lines.png')
plt.imshow(img, cmap='gray')
plt.show()
kernel = np.array([[0, -1, 0],
[1, 0, 1],
[0, -1, 0]])
dst = cv2.filter2D(img, -1, kernel)
cv2.imwrite("filtered.png", dst)
这是图像在卷积之前:
这是卷积后的图像:
我使用的过滤器是:
kernel = np.array([[0, -25, 1],
[-25, 5, -25],
[1, -25, 0]])
结果是:
它并不完美,但希望它能有所帮助。
好吧,根据您在问题中提供的代码,我们获得了除我们想要获得的行之外的行。所以我们可以用它和 dilate
它来填充行。
img = cv2.imread('lines.png')
kernel = np.array([[0, -1, 0],
[1, 0, 1],
[0, -1, 0]])
dst = cv2.filter2D(img, -1, kernel)
kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(dst, kernel, iterations = 1)
然后我们需要删除线上方 45 度角的点,因此我们使用 morphological opening
并阈值图像以将所有线转换为像素值 =255。
kernel = np.ones((7, 7), np.uint8)
opening = cv2.morphologyEx(dilated, cv2.MORPH_OPEN, kernel)
_,thresh = cv2.threshold(opening,10,255,cv2.THRESH_BINARY)
然后使用原始图像的 cv2.bitwise_and
和获得的阈值的 cv2.bitwise_not
我们得到我们的线条。
res = cv2.bitwise_and(img, cv2.bitwise_not(thresh))
我们得到了线条,但是我们需要去掉中间的圆圈。为此,我们在原始图像上使用 cv2.erode
以仅获取中间圆,对其进行阈值处理,然后再次使用 cv2.bitwise_and
和 cv2.bitwise_not
将其从 res.
中移除
kernel = np.ones((7, 7), np.uint8)
other = cv2.erode(img, kernel, iterations = 1)
_,thresh = cv2.threshold(other,10,255,cv2.THRESH_BINARY)
result = cv2.bitwise_and(res, cv2.bitwise_not(thresh))
cv2.imshow("Image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
我想检测图像中仅与原点成 45 度角的线条。我必须只用 3x3 卷积来做。我已经解决了它,所有 45 度角的线都被删除,其他一切都保留下来(与我想要的相反)。从这里达到我的最终目标的任何帮助将不胜感激,谢谢。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Lines.png')
plt.imshow(img, cmap='gray')
plt.show()
kernel = np.array([[0, -1, 0],
[1, 0, 1],
[0, -1, 0]])
dst = cv2.filter2D(img, -1, kernel)
cv2.imwrite("filtered.png", dst)
这是图像在卷积之前:
这是卷积后的图像:
我使用的过滤器是:
kernel = np.array([[0, -25, 1],
[-25, 5, -25],
[1, -25, 0]])
结果是:
它并不完美,但希望它能有所帮助。
好吧,根据您在问题中提供的代码,我们获得了除我们想要获得的行之外的行。所以我们可以用它和 dilate
它来填充行。
img = cv2.imread('lines.png')
kernel = np.array([[0, -1, 0],
[1, 0, 1],
[0, -1, 0]])
dst = cv2.filter2D(img, -1, kernel)
kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(dst, kernel, iterations = 1)
然后我们需要删除线上方 45 度角的点,因此我们使用 morphological opening
并阈值图像以将所有线转换为像素值 =255。
kernel = np.ones((7, 7), np.uint8)
opening = cv2.morphologyEx(dilated, cv2.MORPH_OPEN, kernel)
_,thresh = cv2.threshold(opening,10,255,cv2.THRESH_BINARY)
然后使用原始图像的 cv2.bitwise_and
和获得的阈值的 cv2.bitwise_not
我们得到我们的线条。
res = cv2.bitwise_and(img, cv2.bitwise_not(thresh))
我们得到了线条,但是我们需要去掉中间的圆圈。为此,我们在原始图像上使用 cv2.erode
以仅获取中间圆,对其进行阈值处理,然后再次使用 cv2.bitwise_and
和 cv2.bitwise_not
将其从 res.
kernel = np.ones((7, 7), np.uint8)
other = cv2.erode(img, kernel, iterations = 1)
_,thresh = cv2.threshold(other,10,255,cv2.THRESH_BINARY)
result = cv2.bitwise_and(res, cv2.bitwise_not(thresh))
cv2.imshow("Image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()