【问题标题】:Extracting only specific color from image with scanner artifacts仅从带有扫描仪伪影的图像中提取特定颜色
【发布时间】:2021-10-18 15:33:03
【问题描述】:

我有以下问题:

我只想从扫描图像中提取蓝色笔的颜色,这些图像在白色页面背景上也包含灰度和黑色打印区域。

我可以忽略任何类型的灰度(非彩色)像素值,只保留蓝色部分,图像上除了蓝色之外不会有任何主色。

这听起来像是一个简单的任务,但问题是通过扫描过程,整个图像包含彩色像素,包括蓝色像素,甚至是灰度或黑色部分,所以我不知道如何去隔离那些部分并只保留蓝色部分,这是一个特写来说明我的意思:

以下是图片的外观以供参考:

我希望输出是一个新图像,仅包含用蓝笔绘制/书写的部分,在这种情况下是刺猬/眼睛的绘图。

所以我尝试使用以下代码为图像中的蓝色隔离 HSV 范围:

img = cv.imread("./data/scan_611a720bcd70bafe7beb502d.jpg")
img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

# accepted color range for blue pen
lower_blue = np.array([90, 35, 140])
upper_blue = np.array([150, 255, 255])

# preparing the mask to overlay
mask = cv.inRange(img_hsv, lower_blue, upper_blue)
inverted_mask = cv.bitwise_not(mask)
mask_blur = cv.GaussianBlur(inverted_mask, (5, 5), 0)
ret, mask_thresh = cv.threshold(mask_blur, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

# The black region in the mask has the value of 0,
# so when multiplied with original image removes all non-blue regions
result = cv.bitwise_and(img, img, mask=mask)

cv.imshow("Result", mask_thresh)
k = cv.waitKey(0)

然而结果是这样的:

图片的许多以黑色绘制的部分(例如云图像)不会被删除,因为如上所述,由于扫描过程,它们包含蓝色/彩色像素。

是否有任何方法可以干净地隔离图像的这些蓝色部分,即使存在这些伪影? 该解决方案需要适用于像这样的任何类型的图像,给出的只是一个示例,但如前所述,除了灰色/黑色区域之外,唯一存在的颜色是蓝色笔。

【问题讨论】:

    标签: python numpy opencv image-processing opencv-python


    【解决方案1】:

    您应该重新调整扫描的颜色平面。然后你至少摆脱了那些彩色条纹。我建议扫描一张方格纸进行校准。

    这是使用 OpenCV 的 findTransformECC 完成的。

    完整的例子可以在这里找到:

    这是对齐问题中给出的图片颜色平面的特定代码:

    https://gist.github.com/crackwitz/b8867b46f320eae17f4b2684416c79ea

    (它所做的只是分割颜色平面,调用findTransformECCwarpPerspective,合并颜色平面)

    【讨论】:

    • 感谢您的建议,我尝试打印一张方格纸然后扫描它,并使用扫描文件和原始打印文件调整后对齐,使它们具有相同的尺寸和大致对齐(尽管实际上不可能对齐网格,因为扫描的网格是如此扭曲)。它并没有真正解决,就颜色平面错位而言,结果没有改变(imgur.com/a/b96Y275)我假设错位太大,就像您链接的文章所暗示的那样可能会导致问题。
    • 我并不是说将扫描件与其理想的源文件对齐(如您所见,打印会引入额外的变形),而是将扫描件的颜色平面彼此对齐。随意分享这些图片,而不是截图。
    • 哦,我明白了,是的,我误解了它的工作原理,所以当我的图像与扫描的方格纸作为模板对齐时,它会稍微改变图像,但我认为不会显着。我使用了您链接的文章中的这段代码:learnopencv.com/image-alignment-ecc-in-opencv-c-python 我的原始图像为 im1,方格纸扫描为 im2 结果是这样的:i.imgur.com/6m6JCPw.jpg 差异的屏幕截图:imgur.com/a/cHhaIif
    • 不要为此使用不同的图片。您使用相同图片的颜色平面。这是我通过 findTransformECC 实现的(红/蓝到绿通道,这是三者中最好的)imgur.com/a/ThCkOGa
    • 感谢您对此的耐心等待,因为您可能注意到我在图像处理方面的经验并不多。但是,就黑色区域附近的颜色像素而言,我并没有真正看到您的输出和我的原始扫描(imgur.com/wx9kxJl - 右侧评论的输出图像,我的原始扫描在左侧)有显着差异,我还缺少什么吗?
    【解决方案2】:

    也许可以尝试相反的方法——先搜索黑色部分,然后在这个黑色蒙版周围做一些腐蚀,然后在搜索蓝色之前移除它周围的所有部分。云中的“主要”颜色仍然是黑色,因此您可以围绕它进行调整。

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2010-09-19
      • 1970-01-01
      • 2019-04-01
      • 2013-03-17
      • 1970-01-01
      • 2011-09-22
      • 2011-02-07
      • 2012-08-15
      相关资源
      最近更新 更多