【发布时间】: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