gpt4 book ai didi

python-3.x - 从 Python 中的图像中提取特定颜色范围的简单方法?

转载 作者:行者123 更新时间:2023-12-02 16:06:32 24 4
gpt4 key购买 nike

我正在尝试使用 cv2 模块从定义的 RGB 范围内的图像中提取特定颜色。在下面的示例中,我试图在黄色和白色 RGB 值之间从航天飞机的排气中隔离火焰,然后打印出该范围内 RGB 值与图像其余部分相比的百分比。

这是我的最小工作示例:

import cv2
import numpy as np
from matplotlib import pyplot as plt
import imageio

img = imageio.imread(r"shuttle.jpg")
plt.imshow(img)

这是输出图像。 Its from wikipedia.

enter image description here
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

color1 = (255,255,0) #yellow
color2 = (255,255,255) #white
boundaries = [([color1[0], color1[1], color1[2]], [color2[0], color2[1], color2[2]])]
for (lower, upper) in boundaries:
lower = np.array(lower, dtype=np.uint8)
upper = np.array(upper, dtype=np.uint8)
mask = cv2.inRange(img, lower, upper)
output = cv2.bitwise_and(img, img, mask=mask)
ratio = cv2.countNonZero(mask)/(img.size/3)
print('pixel percentage:', np.round(ratio*100, 2))
plt.imshow(mask)

但是,这似乎不起作用,因为我在黄色和白色值之间得到了 0% 的像素。我不确定我哪里出错了:
[([255, 255, 0], [255, 255, 255])]
pixel percentage: 0.0

输出图显示为空白,带有蓝色/紫色图像:

enter image description here

注意我没有使用 cv2 的内置图像查看器,例如 cv2.imshow()、cv2.waitKey() 和 cv2.destroyAllWindows(),因为在 Windows 8.1 上调用它们会导致我的 IDE (Spyder 3.3.1) 崩溃。不确定这是否是图像显示为蓝色/紫色的原因?

此外,当我只是尝试输出原始图像时,它以一种奇怪的反转颜色格式出现:
plt.imshow(img)

enter image description here

无论如何,我之前尝试过遵循类似的方法来检测特定的颜色范围 described here但是,当我尝试实现以下内容时,该特定方法在编译期间给我带来了问题,并且多次卡住和崩溃了我的计算机:
imask = mask>0
exhaust_color = np.zeros_like(img, np.uint8)
green[imask] = img[exhaust_color]

我想我在这里尝试实现的目标类似于下图,其中仅显示黄色和白色之间的颜色,然后打印出由这些颜色组成的像素百分比。对于下面的图像,我只是使用基本图像处理软件过滤掉了低于 RGB (255, 255, 0) 的所有颜色。

有没有办法使用我已经编写的代码或类似的代码来实现这一点?

enter image description here

编辑 1:按照以下建议首先转换为 HSV 颜色空间。但是它仍然不起作用,黄色到白色的像素百分比仍然是 0%。输出图表仍然相同,显示全部为黑色或紫色。我还设法通过将 1 传递给 cs2.waitKey(1) 来使 cv2.imshow() 工作。 (由于某种原因不适用于 0。)
#CONVERT TO HSV COLORS
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
color1 = np.uint8([[[0, 255, 255 ]]]) #yellow
color2 = np.uint8([[[255, 255, 255]]]) #white
hsv_color1 = cv2.cvtColor(color1,cv2.COLOR_BGR2HSV)
hsv_color2 = cv2.cvtColor(color2,cv2.COLOR_BGR2HSV)

print(hsv_color1)
print(hsv_color2)

#Define threshold color range to filter
mask = cv2.inRange(hsv_img, hsv_color1, hsv_color2)

# Bitwise-AND mask and original image
res = cv2.bitwise_and(hsv_img, hsv_img, mask=mask)
ratio = cv2.countNonZero(mask)/(hsv_img.size/3)
print('pixel percentage:', np.round(ratio*100, 2))
#plt.imshow(mask)

cv2.imshow('mask',res)
cv2.waitKey(1)

输出
[[[ 30 255 255]]]
[[[ 0 0 255]]]
pixel percentage: 0.0

最佳答案

这是一个非常简单的问题。你在给 cv2.inRange 之前给了一个更大的颜色,所以没有有效的交叉点!这是一些显示输出的工作代码。这应该很容易适应您自己的脚本。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('shuttle.jpg') # you can read in images with opencv
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

hsv_color1 = np.asarray([0, 0, 255]) # white!
hsv_color2 = np.asarray([30, 255, 255]) # yellow! note the order

mask = cv2.inRange(img_hsv, hsv_color1, hsv_color2)

plt.imshow(mask, cmap='gray') # this colormap will display in black / white
plt.show()

enter image description here

关于python-3.x - 从 Python 中的图像中提取特定颜色范围的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52315895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com