opencv 3色阈值化:黑色、白色和灰色,而不仅仅是黑色和白色

66bbxpm5  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(205)

我希望可以阈值为3种颜色:黑色、白色和灰色,而不仅仅是黑色和白色,这样以后我就可以把贴纸从原来的img中分离出来

现在我的.py脚本可以阈值化,使图像的颜色为白色色

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters


# load the image
image = skimage.io.imread("/home/student_joy/desktop/optimization_11_10/original_duplicate.png")[:,:,:3]

# image = imageio.imread(image_name)[:,:,:3]
# img = rgb2gray(image)

fig, ax = plt.subplots()
plt.imshow(image)

# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)

# create a mask based on the threshold
t = 0.72
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")

plt.show()

见结果图:https://imgur.com/a/u4KvF7Z
我不确定如何正确设置binary_mask,即t

kb5ga3dv

kb5ga3dv1#

binary_mask = blurred_image < t

当你计算右边的布尔表达式时,这将给予false(0)或true(1)作为掩码的目标值(如果你真的需要一个掩码,这是有意义的,因为它是一个二进制图像)。
如果您只想分离贴纸区域(因此删除所有灰色区域),您可以执行以下操作

t1 = 0.5
t2 = 0.72
binary_mask = 1 - ((t1 < blurred_image) & (blurred_image < t2))

或者使用cv.threshold()进行类似操作。
关于发现你的门槛:如果你点击这个链接How to get threshold value from histogram?并查找“大津的二值化“部分,它解释了如何为双峰直方图区域获取阈值。屏蔽掉你刚刚发现的灰色区域,只留下黑色和白色的贴纸,然后让Otsu处理剩下的部分。

相关问题