【问题标题】:Equivalent OpenCV code for a Image Magick commandImage Magick 命令的等效 OpenCV 代码
【发布时间】:2025-11-29 02:05:02
【问题描述】:

我正在尝试预处理我的图像以从中删除水平线和垂直线(某些 OCR 需要)。我得到了一些 Image Magick 代码来做同样的事情,效果很好。下面是sn-p:

magick convert ( img_name.jpg )    
( -clone 0 -morphology close rectangle:1x50 -negate +write tmp1.png )    
( -clone 0 -morphology close rectangle:50x1 -negate +write tmp2.png )    
( -clone 1 -clone 2 -evaluate-sequence add +write tmp3.png )
-delete 1,2     
-compose plus -composite    
result.jpg

这是从以下链接获得的(完全归功于他们):

Remove all horizontal and vertical lines from an image

问题是即使 Image Magick 效果很好,但在高分辨率图像上需要很长时间(这是我最常拥有的)。所以我试图将上面的 sn-p 转换为 Open CV Python 代码。我已经为第 1 步和第 2 步编写了部分代码。

第 1 步和第 2 步:

img = cv2.imread('img_name.jpg', cv2.IMREAD_COLOR)
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
kernel_horizontal = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))

temp_1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_vertical)
#cv2.imwrite('temp_1.png',temp_1)

temp_2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_horizontal)
#cv2.imwrite('temp_2.png',temp_2)

但是,我无法执行第 3 步和第 4 步,因为我不确定 evaluate-sequence 运算符的作用。我在网上查过,但不是很明白。如果有人能帮我翻译剩下的步骤,我将不胜感激。

【问题讨论】:

  • -evaluate-sequence add 只是对两个图像进行算术加法,并裁剪到 0 到 255 的范围。-compose plus 将 tmp3 添加到带裁剪的输入中。 (两种不同的图像添加方式)。请注意,您需要在 Python (255-tmp1) 和 (255-tmp2) 中反转 tmp1 和 tmp2 图像,这相当于 Imagemagick 中的 -negate。请注意,在 Imagemagick 7 中正确使用 magick,而不是 magick convert。

标签: python-3.x opencv imagemagick image-morphology


【解决方案1】:

这是 Python/OpenCV 中的等效命令。

输入:

import cv2
import numpy as np

img = cv2.imread('document.png')

# do morphology to locate vertical lines and invert
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_vertical)
temp1 = (255-temp1)

# do morphology to locate horizontal lines and invert
kernel_horizontal = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_horizontal)
temp2 = (255-temp2)

# add the two temp images together
temp = cv2.add(temp1, temp2)

# add temp to img to create result
result = cv2.add(temp, img)

# write result to disk
cv2.imwrite("document_lines_removed.png", result)

# display it
cv2.imshow("temp1", temp1)
cv2.imshow("temp2", temp2)
cv2.imshow("temp", temp)
cv2.imshow("result", result)
cv2.waitKey(0)


【讨论】:

  • 谢谢。这就是我一直在寻找的。接受答案:)
  • 这是对掩码和按位运算的非常巧妙的使用。谢谢@fmw42,我以后可能会借这个:)
  • @nathancy 没问题。谢谢。我也从您的所有回答中学到了很多东西。