【发布时间】:2021-04-06 06:01:17
【问题描述】:
我正在尝试以有效的方式对图像的所有像素应用一个函数(在我的具体情况下,我想对每个像素进行一些颜色近似,但我认为这与问题无关)。问题是我找到了不同的方法来做到这一点,但它们都在像素的每个组件上应用一个函数,而我想要做的是应用一个函数 接收一个像素(不是像素分量),这是 3 个 rgb 分量(我猜是一个元组,但我不关心格式,只要我在函数中有 3 个分量作为参数)。
如果您对我拥有的东西感兴趣,这是解决我的问题的无效解决方案(工作正常,但速度太慢):
def closest_colour(pixel, colours):
closest_colours = sorted(colours, key=lambda colour: colours_distance(colour, pixel))
return closest_colours[0]
# reduces the colours of the image based on the results of KMean
# img is image open with opencv.imread()
# colours is an array of colours
def image_color_reduction(img, colours):
start = time.time()
print("Color reduction...")
reduced_img = img.copy()[...,::-1]
width = reduced_img.shape[0]
height = reduced_img.shape[1]
for x in range(width):
for y in range(height):
reduced_img[x,y] = closest_colour(reduced_img[x,y], colours)
end = time.time()
print(f"Successfully reduced in {end-start} seconds")
return reduced_img
我已经关注了这篇文章:PIL - apply the same operation to every pixel,这似乎很清楚并且与我的问题一致。我尝试过使用任何类型的图像格式,我尝试过多线程(使用 pool.map 和 pool.imap),我尝试过 numpy.apply_along_axis,最后我尝试了 PIL.point(),我认为是与我正在寻找的最相似的解决方案。事实上,如果您查看他们的官方文档:.point(),它确切地说:该函数为每个可能的像素值调用一次。我发现这确实具有误导性,因为在尝试之后我意识到 pixel value 在这种情况下并不是指一个 rgb 元组,而是指 3 个 rgb 组件中的每一个(说真的,在什么世界里?)。
如果有人能分享一些他们的经验并让我对这个问题有所了解,我将不胜感激。提前谢谢你!
(更新)
根据您的要求,我添加了有关我正在处理的具体问题的更多信息:
给定
- 大小为 1022*1080 的图像 M
- 大小为 1 的颜色 N 数组
通过将每个像素的颜色替换为最 N中类似的一个(感谢您的回答,我知道这被定义为 最近邻颜色量化)
这是 colours_distance 的缺失实现:
def colours_distance(c1, c2):
(r1,g1,b1) = c1
(r2,g2,b2) = c2
return math.sqrt((r1 - r2)**2 + (g1 - g2) ** 2 + (b1 - b2) **2)
这是运行此代码所需的导入:
import cv2
import time
import math
我的问题中显示的解决方案平均在不到 40 秒的时间内解决了所描述的问题。
【问题讨论】:
-
在 numpy 和 pandas 中应用函数通常在底层运行 python 级别的 for 循环。它们甚至没有被远程矢量化。如果你想要快速的东西,展示你是如何实现你的功能的。
-
另外,使用
min而不是每次都使用sorted对整个数组进行排序:_, v = min((key(v), v) for v in blah) -
请出示
colour_distance函数。 -
如果您的问题不清楚,您往往得不到最佳答案。您似乎没有指定您的图像有多大(以像素为单位)、当前处理需要多长时间、您选择了多少种颜色或算法
colours_distance涉及什么......您也没有提供有代表性的图像和删除了您所有的import语句,因此没有人可以实际运行您的代码。 -
Python 不是实现循环图像算法的正确语言,但它是调用此类算法的正确语言。你可以试试 Numba 来加速你的代码。
标签: python numpy opencv image-processing python-imaging-library