我有一个具有 12 种不同颜色的 rgb 图像,但我事先不知道颜色(像素值)。我想转换 0 到 11 之间的所有像素值,每个像素值代表原始 rgb 图像的独特颜色。
例如所有 [230,100,140] 转换为 [0,0,0] ,所有 [130,90,100] 转换为 [0,0,1] 等等......所有 [210,80,50] 转换为 [0,0, 11].
快速而肮脏的应用程序。很多地方都可以改进,尤其是逐个像素地遍历整个图像不是很 numpy 也不是很 opencv,但我懒得记住到底如何阈值和替换 RGB 像素。
import cv2
import numpy as np
#finding unique rows
#comes from this answer : http://stackoverflow.com/questions/8560440/removing-duplicate-columns-and-rows-from-a-numpy-2d-array
def unique_rows(a):
a = np.ascontiguousarray(a)
unique_a = np.unique(a.view([('', a.dtype)]*a.shape[1]))
return unique_a.view(a.dtype).reshape((unique_a.shape[0], a.shape[1]))
img=cv2.imread(your_image)
#listing all pixels
pixels=[]
for p in img:
for k in p:
pixels.append(k)
#finding all different colors
colors=unique_rows(pixels)
#comparing each color to every pixel
res=np.zeros(img.shape)
cpt=0
for color in colors:
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if (img[i,j,:]==color).all(): #if pixel is this color
res[i,j,:]=[0,0,cpt] #set the pixel to [0,0,counter]
cpt+=1
我是一名优秀的程序员,十分优秀!