对相同大小的图像进行逐像素比较,以找到每个像素最常见的颜色
Pixel-wise comparison of equally sized images to find the most common colour for every pixel
假设我有一张图片转换成数组
data1= numpy.asarray(source1.png)
data2= numpy.asarray(source2.png)
data3= numpy.asarray(source3.png)
data4= numpy.asarray(source4.png)
data5= numpy.asarray(source5.png)
据我所知,如果我 print(data1)
我会得到一个数组,显示每个给定位置的每个像素的 RGB 值。
现在我想比较所有的数组data1, data2, data3, data 4, data5
并找到出现频率最高的每个像素的RGB值并将其输出为新的数组/图片
举个例子:
对于位置 X1Y1 和 X2Y1,数组看起来像这样
data1= [[0 0 255], [0 1 0]]
data2= [[0 0 255], [0 1 0]]
data3= [[0 0 255], [0 1 0]]
data4= [[0 0 254], [0 1 0]]
data5= [[0 0 254], [0 1 0]]
由于 [(0,0,255)]
是位置 X1Y1 和 X2Y1 最常见的值,新数组将保存为 avg= [(0, 0, 255), (0, 1, 0)]
有没有可以做到这一点的功能?我对数组的理解正确吗?
您可以将 rgb 值转换为单个 16 进制整数并使用 np.unique
查找重复值,如下所示:
def rgb_to_base16(rgb):
return int('0x{0:02X}{1:02X}{2:02X}'.format(*rgb), 16)
def base16_to_rgb(base16):
return np.array([base16 >> 16, base16 >> 8 & 0xFF, base16 & 0xFF])
def find_most_common(values):
unique_values, counts = np.unique(values, return_counts=True)
if len(unique_values) == len(values):
return [255, 255, 255]
else:
return base16_to_rgb(unique_values[np.argmax(counts)])
stacked = np.stack((img_1, img_2, img_3, img_4), axis=2)
hexified = np.apply_along_axis(rgb_to_base16,
axis=-1,
arr=stacked).astype(np.int)
most_common = np.apply_along_axis(lambda values: find_most_common(values),
axis=-1,
arr=hexified).astype(np.uint8)
假设您想单独比较 r、g 和 b 值的原始答案:
您可以使用 np.bincount
和 np.argmax
获得最常出现的值,您可以使用 np.apply_along_axis
将其应用于堆叠图像阵列的最后一个轴:
stacked = np.stack((img_1, img_2, img_3), axis=3)
most_common = np.apply_along_axis(lambda x: np.argmax(np.bincount(x)), axis=-1, arr=stacked).astype(np.uint8)
请注意,如果 none 出现不止一次,此方法将 return 每个 r、g 和 b 的最低值,并且 np.bincount
仅适用于非负整数。
如果您想 return 为每个 r、g 和 b 设置一个自定义值,如果它们 none 重复,您可以将此行为定义为函数而不是 lambda 表达式:
def find_most_common(values):
most_common = np.argmax(np.insert(np.bincount(values), 0, 1))
if most_common == 0:
return 125
else:
return most_common - 1
most_common = np.apply_along_axis(lambda values: find_most_common(values), axis=-1, arr=stacked).astype(np.uint8)
这里我们在 bin 计数前加上一个 1,这样如果 none 的其他值出现不止一次,argmax
将 return 0。
假设我有一张图片转换成数组
data1= numpy.asarray(source1.png)
data2= numpy.asarray(source2.png)
data3= numpy.asarray(source3.png)
data4= numpy.asarray(source4.png)
data5= numpy.asarray(source5.png)
据我所知,如果我 print(data1)
我会得到一个数组,显示每个给定位置的每个像素的 RGB 值。
现在我想比较所有的数组data1, data2, data3, data 4, data5
并找到出现频率最高的每个像素的RGB值并将其输出为新的数组/图片
举个例子: 对于位置 X1Y1 和 X2Y1,数组看起来像这样
data1= [[0 0 255], [0 1 0]]
data2= [[0 0 255], [0 1 0]]
data3= [[0 0 255], [0 1 0]]
data4= [[0 0 254], [0 1 0]]
data5= [[0 0 254], [0 1 0]]
由于 [(0,0,255)]
是位置 X1Y1 和 X2Y1 最常见的值,新数组将保存为 avg= [(0, 0, 255), (0, 1, 0)]
有没有可以做到这一点的功能?我对数组的理解正确吗?
您可以将 rgb 值转换为单个 16 进制整数并使用 np.unique
查找重复值,如下所示:
def rgb_to_base16(rgb):
return int('0x{0:02X}{1:02X}{2:02X}'.format(*rgb), 16)
def base16_to_rgb(base16):
return np.array([base16 >> 16, base16 >> 8 & 0xFF, base16 & 0xFF])
def find_most_common(values):
unique_values, counts = np.unique(values, return_counts=True)
if len(unique_values) == len(values):
return [255, 255, 255]
else:
return base16_to_rgb(unique_values[np.argmax(counts)])
stacked = np.stack((img_1, img_2, img_3, img_4), axis=2)
hexified = np.apply_along_axis(rgb_to_base16,
axis=-1,
arr=stacked).astype(np.int)
most_common = np.apply_along_axis(lambda values: find_most_common(values),
axis=-1,
arr=hexified).astype(np.uint8)
假设您想单独比较 r、g 和 b 值的原始答案:
您可以使用 np.bincount
和 np.argmax
获得最常出现的值,您可以使用 np.apply_along_axis
将其应用于堆叠图像阵列的最后一个轴:
stacked = np.stack((img_1, img_2, img_3), axis=3)
most_common = np.apply_along_axis(lambda x: np.argmax(np.bincount(x)), axis=-1, arr=stacked).astype(np.uint8)
请注意,如果 none 出现不止一次,此方法将 return 每个 r、g 和 b 的最低值,并且 np.bincount
仅适用于非负整数。
如果您想 return 为每个 r、g 和 b 设置一个自定义值,如果它们 none 重复,您可以将此行为定义为函数而不是 lambda 表达式:
def find_most_common(values):
most_common = np.argmax(np.insert(np.bincount(values), 0, 1))
if most_common == 0:
return 125
else:
return most_common - 1
most_common = np.apply_along_axis(lambda values: find_most_common(values), axis=-1, arr=stacked).astype(np.uint8)
这里我们在 bin 计数前加上一个 1,这样如果 none 的其他值出现不止一次,argmax
将 return 0。