python - 查找图像的最小值和最大值
问题描述
我将一些图像(带有cv2.imread_color
)加载到列表中,并尝试使用 function 从中获取 hsv (色相、饱和度、值)值rgb_to_hsv
。
我得到了红色、绿色和蓝色的值,但是当我试图获取 hsv 值时,我得到一个关于参数的错误:
Traceback (most recent call last):
File "C:\Users\Downloads\preprocessing\program.py", line 69, in <module>
hue_images[i], saturnation_images[i], value_images[i] = rgb_to_hsv(hsv_red[i], hsv_green[i], hsv_blue[i])
File "C:\Users\Downloads\preprocessing\program.py", line 24, in rgb_to_hsv
mx = max(r, g, b)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这是我正在使用的代码:
hue_images = list(range(len(image)))
saturnation_images = list(range(len(image)))
value_images = list(range(len(image)))
hsv_red = list(range(len(image)))
hsv_green = list(range(len(image)))
hsv_blue = list(range(len(image)))
def rgb_to_hsv(r, g, b):
r, g, b = r/255.0, g/255.0, b/255.0
mx = max(r, g, b)
mn = min(r, g, b)
df = mx-mn
if mx == mn:
h = 0
elif mx == r:
h = (60 * ((g-b)/df) + 360) % 360
elif mx == g:
h = (60 * ((b-r)/df) + 120) % 360
elif mx == b:
h = (60 * ((r-g)/df) + 240) % 360
if mx == 0:
s = 0
else:
s = (df/mx)*100
v = mx*100
return h, s, v
def hsv_get_red(img):
red = img.copy()
red[:, :, 0] = 0
red[:, :, 1] = 0
return red[:, :, 2]
def hsv_get_green(img):
green = img.copy()
green[:, :, 0] = 0
green[:, :, 2] = 0
return green[:, :, 1]
def hsv_get_blue(img):
blue = img.copy()
blue[:, :, 2] = 0
blue[:, :, 1] = 0
return blue[:, :, 0]
for i in range(len(image)):
hsv_red[i] = hsv_get_red(image[i])
hsv_green[i] = hsv_get_green(image[i])
hsv_blue[i] = hsv_get_blue(image[i])
for i in range(len(image)):
hue_images[i], saturnation_images[i], value_images[i] = rgb_to_hsv(hsv_red[i], hsv_green[i], hsv_blue[i])
我的问题是:如何使用列表值作为函数中的参数(它与 int 数字一起使用)来获取结果(另一个列表值)?
解决方案
r
g
b
您传递的参数是 opencv 库的 Mat“数组”
内置函数min
和max
函数不知道如何处理它们 - 你必须使用 numpy 库的 min 和 max 函数
import numpy as np
np.max([r,g,b])
或手动遍历所有 r,g,b 值以查找最小值和最大值,如果您不想要 numpy 依赖项,例如
import itertools
maximum = max( x for x in itertools.chain(r.reshape(r.size),g.reshape(g.size),b.reshape(b.size)))
不幸的是 cv2.min 不像 numpy min 那样工作,它在这里没有用
推荐阅读
- c# - var 与其他关键字有何不同?
- cordova - 在部署有关 apache cordova 4.1.1 或更高版本的构建时,我遇到了来自 google play 控制台的漏洞问题
- dart - 可以在构造函数中调用异步方法吗?
- c# - SQL 唯一索引阻止来自 Json API 的所有数据的所有 Db 输入
- python - 将进度条绑定到线程
- python - 如何在 discord.py 机器人加入语音通道之间添加暂停?
- java - 为什么如果我从 IDE (Eclipse) 将 Spring Boot 应用程序作为 Java 应用程序启动它可以工作,但是当我从 CMD 启动它时会出现 Whitelabel 错误?
- javascript - Tone.js 中的 NoiseSynth 没有声音
- javascript - 如何使用百分比使 CSS 过渡更平滑?
- c# - 使用敲除添加简单的下拉列表