-1

无论颜色变化如何,我都想对图像进行阈值处理。前任:

输入图像

我想在输入中对这两个字母设置阈值并在输出中显示。但是当我对图像进行阈值处理时,只显示一个字母。如何使用 Opencv 和 Python 做到这一点?

带有示例的附加信息:新示例示例的两个输入图像显示一个图像的字母颜色比背景颜色浅,而另一个图像的字母颜色较深。我想要的是对这两个图像进行阈值化以获得相同的输出。(白底黑字)

4

3 回答 3

1

如果您直接将此彩色图像转换为灰色并对其进行阈值处理,那么您将得到这个。它不适合阈值两者A

在此处输入图像描述

但是,如果您将频道拆分为BGR,您将得到以下信息:

在此处输入图像描述


显然,阈值B通道将起作用。

在此处输入图像描述


#!/usr/bin/python3
# 2018.01.14 16:31:39 CST
# 2018.01.14 16:50:45 CST
import cv2
img = cv2.imread("img12.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
b,g,r = cv2.split(img)
th, threshed1 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
th, threshed2 = cv2.threshold(b, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imwrite("threshed_gray.png", threshed1)
cv2.imwrite("threshed_blue.png", threshed2)
于 2018-01-14T08:52:26.600 回答
0

如果您的背景是恒定颜色,您可以搜索完全匹配或非常接近的匹配并从中创建新图像。只要颜色是背景色,就设置一个白色像素,否则设置一个黑色像素。不需要阈值。

这是在 PIL 而不是 Opencv 中的样子:

from PIL import Image
im = Image.open(filename)
ld = im.load()
bg_r, bg_g, bg_b = ld[0,0]
for y in range(im.size[1]):
    for x in range(im.size[0]):
        r, g, b = ld[x,y]
        if abs(r - bg_r) <= 1 and abs(g - bg_g) <= 1 and abs(b - bg_b) <= 1:
            ld[x,y] = (255, 255, 255)
        else:
            ld[x,y] = (0, 0, 0)

在此处输入图像描述

于 2018-01-14T17:17:57.840 回答
0

如果您知道背景颜色是恒定的,则可以创建非背景颜色的二进制图像。

out = im != BG_COLOR

IE

import cv2
im = cv2.imread(r"A.png")
BG_COLOR = im[0:0]

out = im != BG_COLOR

cv2.imwrite("A_masked.png", out * 255) # make it 8bit for output

输出蒙版图像:

在此处输入图像描述

于 2019-08-08T07:20:30.460 回答