python - 如何使用 Python 从原始图像中删除所有检测到的线条?

标签 python opencv image-processing computer-vision straight-line-detection

我正在尝试删除图像中存在的所有线条。 我能够检测到线条,但是当我尝试删除线条时,最终图像中仍然只有几条细线。我已使用 cv2.getStructuringElement 获取水平线和垂直线。在某些情况下,最终图像变得完全扭曲,我无法继续前进

图片来自google

Original Image Lines detected

    res = verticle_lines_img + horizontal_lines_img 
    res = cv2.bitwise_not(res)
    fin=cv2.bitwise_or(img_bin, res,mask =cv2.bitwise_not(res))
    fin= cv2.bitwise_not(fin)
    exp =255-res
    final = cv2.bitwise_and(exp,img_bin)
    final = cv2.bitwise_not(final)
    exp = ~exp
    finalised = cv2.bitwise_and(img_bin,final)
    finalised = cv2.bitwise_not(finalised)

求助!谢谢

最佳答案

这是一个方法

  • 将图像转换为灰度
  • Otsu 获取二值图像的阈值
  • 删除水平线
  • 删除垂直线

转为灰度后,我们用Otsu的阈值得到二值图像

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

从这里我们构建了一个特殊的水平内核来检测水平线。一旦检测到线条,我们填充线条以有效去除线条

# Remove horizontal
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

同样,为了去除垂直线,我们构造了一个特殊的垂直核

# Remove vertical
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,10))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

这是检测到的绿色线条

结果

您可以通过调整内核大小来微调结果。例如,将 (10,1) 更改为 (15,1) 将加强线检测,同时将其降低到 (5,1) 会放松检测

完整代码

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Remove horizontal
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

# Remove vertical
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,10))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()

关于python - 如何使用 Python 从原始图像中删除所有检测到的线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57961119/

相关文章:

python - 网络抓取电话号码

python - 如何使用pycharm连接spark和mysql

c++ - CudaMemCpy 在复制 vector<cv::Point3f> 时返回 cudaErrorInvalidValue

matlab - 一种更快的高斯拉普拉斯算子方法

image - 如何使用 Flipdim 翻转图像中的红色和绿色 channel ?

java - 如何通过评估相等邻域像素的百分比来减少图像中的噪声 - Java OpenCV

python - Theano 中每个时间步具有动态输入的 RNN

python - 在Python中随机生成二维列表

c++ - 应用warpperspective(opencv)后如何发现坐标(0,0)?

opencv - 运行 thumbor 会产生 ImportError : No module named cv2. cv