我有以下问题:
我只想从扫描图像中提取蓝色钢笔的颜色,这些图像也包含白色页面背景上的灰度和黑色打印区域。
我不介意任何类型的灰度(非彩色)像素值,只保留蓝色的部分,不会有任何主导颜色,除了蓝色的图像。
这听起来很简单,但问题是,通过扫描过程,整个图像包含了彩色像素,包括蓝色像素,甚至灰度部分或黑色部分,所以我不知道如何隔离这些部分,只保留蓝色的部分,这里有一个特写来展示我的意思:
下面是图片的样子,以供参考:
我希望输出是一个新的图像,只包含用蓝色钢笔绘制/写的部分,在本例中是刺猬/眼睛的绘图。
因此,我尝试使用以下代码来隔离图像中的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)
然而,其结果是:
由于扫描过程的原因,许多用黑色绘制的图像(如云图像)不会被删除,因为正如前面提到的,它们包含蓝色/彩色像素。
有什么方法可以让图像的那些蓝色部分被干净的隔离,即使存在这些工件吗?解决方案将需要工作的任何类型的图像,给出的只是一个例子,但正如前面提到的,唯一的颜色将是蓝色的钢笔,除了灰色/黑色的区域。
发布于 2021-08-17 13:47:04
您应该重新调整扫描的颜色平面。那你至少摆脱了那些彩色条纹。我建议扫描一张图表纸来校准。
这是使用OpenCV的findTransformECC
完成的。
在这里可以找到完整的例子:
这里有一些特定的代码来对齐问题中给出的图片的颜色平面:
https://gist.github.com/crackwitz/b8867b46f320eae17f4b2684416c79ea
(它所做的就是拆分颜色平面,调用findTransformECC
和warpPerspective
,合并颜色平面)
https://stackoverflow.com/questions/68805250
复制相似问题