gpt4 book ai didi

Python Pillow HSV 颜色选择;使其更加具体

转载 作者:行者123 更新时间:2023-12-01 08:07:23 24 4
gpt4 key购买 nike

我正在开发一个网络应用程序,它允许您使用颜色编辑图像,例如为黑白图像着色或在彩色图像中切换汽车的颜色。

我选择颜色的第一个方法是对 RGB 中的颜色进行采样,然后从那里开始工作。问题在于 RGB 的颜色变化如此之大,以至于从图像中选择类似紫色的阴影,您最终可能会重新选择多次,并且仍然有一些尚未采样的小框。例如,这是原始图像:

enter image description here

使用webapp我在图像之间选择一个小框区域来采样颜色,然后在下面显示颜色匹配的位置

enter image description here

你可以看出它有一个小盒子区域和颜色匹配的小点。

我做了一些研究,发现 HSV(色相、饱和度和明度)是选择颜色深浅的​​更简单方法。

因此,使用与 web 应用程序提供感兴趣区域相同的方法,我像往常一样获取感兴趣区域,然后如果使用 hsv 获取感兴趣区域的色调值并使用它来检查图像、所有像素具有相同的色调值,这将作为新的选择区域返回,然后用于对所有这些新像素进行颜色采样。

这是下面的代码

def get_hsv_positions(image, positions):
#hsv comes in hue (color of image), saturation and value that's supposed to be how light or dark the color is
hsv_image = image.convert('HSV')

values = []

for pixel in positions:
values.append(hsv_image.getpixel(tuple(pixel)))

hues = set([x[0] for x in values])
hue_matches = []

width, height = image.size

img_width, img_height = 0,0

for _ in range(width * height):
if img_width == width:
img_height += 1
img_width = 0

pixel = hsv_image.getpixel((img_width, img_height))
if pixel[0] in hues:
hue_matches.append((img_width, img_height))

img_width += 1

return hue_matches

def get_color_range(request):
...

#this gets the x,y position on the image of interest to sample colors
cells = []
for item in selection:
pos = get_position(item['position']['left'], item['position']['top'], image.width, image.height, width, height)
item['position']['top'] = pos[1]
item['position']['left'] = pos[0]

scale_grid(item, width, height, image.width, image.height)
cells.extend(get_cells(item))

image = PILImage.open(image_url)

if hsv:
cells = get_hsv_positions(image, cells)

这就是它现在对图像进行采样的方式

enter image description here

它更好,但并不完美,正如您在这里所说的

原始图像采样肤色

enter image description here

使用 HSV 采样

enter image description here

不使用 HSV 进行采样

enter image description here

正如您所见,HSV 会获取更多在图像上以小形状形式弹出的小色调,但不会获取全部。

我希望那些在数据科学或其他领域进行过图像处理的人可能会有所帮助。

这也是我在业余时间制作和工作的一个开源项目,所以如果您有兴趣,可以查看 source code ,这是 quick intro有关其工作原理的视频。因此,如果您想为其做出贡献,您知道 channel :)或免费使用它,无论什么对您有用。

最佳答案

我想到的一个解决方案是在选取范围内的像素时模糊图像的色调 channel 。这应该可以消除色调的突然变化(即肖像中的四四方方的伪像)。

一种方法是将色调 channel 转换为 numpy 数组,应用高斯滤波器,然后使用它创建蒙版。这是对 get_hsv_positions 函数的粗略重写,它使用 numpy 和 scipy 而不是循环。

import numpy as np
from scipy.ndimage import gaussian_filter

def get_hsv_positions_smooth(image, positions):
#hsv comes in hue (color of image), saturation and value that's supposed to be how light or dark the color is
hsv_image = image.convert('HSV')

# convert to numpy array
hsv_image = np.array(hsv_image)
hue_channel = hsv_image[0, :, :] # indexed (channel, row, column)

# get the matching hues
matching_hues = set()
for x,y in positions:
matching_hues.add(hue_channel[x, y])

# blur hue channel
SIGMA = 2
blurred_hue = gaussian_filter(hue_channel, SIGMA)

# mask the matching values
mask = np.isin(blurred_hue, matching_hues)

# get a list of [(x, y), ...] true values in the mask
xs, ys = np.nonzero(mask)
return zip(xs, ys)

值得注意的是,您可能想要研究具有不同属性的其他类型的模糊。

编辑:我将之前的解决方案下移,因为我认为模糊可能会给您带来更好的结果。

一种解决方案是人为地平滑/扩展允许色调的色调列表。在给定的 ROI 中,您选择的色调可能不是连续的(例如深蓝色和青色,但不是中间的蓝色),并且可能会在不自然的阈值处被切断。

我建议将hues制作为np.array所以进行这些操作会更容易一些。如果您的 hues 数组看起来像 [30, 31, ..., 40, 230, 231, ..., 240] 您可以使用

import numpy as np

hues = np.array(hues) # numpy it
blended_hues = np.concatenate([
hues + 1, hues + 2, ... # as many points out as you want
hues - 1, hues - 2, ...
])
all_hues = list(np.unique(np.concatenate([hues, blended_hues])))

然后all_hues将拥有您的原始色调和一些额外的内容。

另一个解决方案可能是查看 CIE色彩空间。在这些中,通常 XY 是将色调扩展到二维,因此您可以进行更复杂的颜色混合。

关于Python Pillow HSV 颜色选择;使其更加具体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55476067/

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