[英]Split image in N images, where N is the number of colors appearing on it
我正在嘗試根據它包含的 colors 拆分圖像。
我之前的步驟是使用Sklearn
提供的 KMeans 算法將其簡化為 3 colors,我得到如下圖所示的結果。
現在我需要將它分成 3 張圖像,每種顏色一張。 並獲得與此類似的東西(我已經用 Photoshop 完成了)。
這些例子都是黑白的,因為如果我真的能做除法,我就不再需要 colors。 但我也可以使用 3 張彩色圖像。
面具 1:
面具 2:
面具 3:
我找到了這個問題,但我無法實現我的目標。
我曾想過按渠道分開,但我認為這是錯誤的。
# set green and red channels to 0
blue_img[:, :, 1] = 0
blue_img[:, :, 2] = 0
# set blue and red channels to 0
green_img[:, :, 0] = 0
green_img[:, :, 2] = 0
# set blue and green channels to 0
red_img[:, :, 0] = 0
red_img[:, :, 1] = 0
我認為關鍵在於我的 kmeans 算法,因為通過它我獲得了 colors 的labels
和centroids
,但我真的不知道該怎么做,而且我找不到任何人這樣做。
我的 KMeans 算法是:
def get_colors(img, number_of_colors, show_chart, show_segmented_img):
modified_image = img.reshape(img.shape[0]*img.shape[1], 3)
myKMeans = KMeans(n_clusters = number_of_colors)
labels = myKMeans.fit_predict(modified_image)
counts = Counter(labels)
centroids = myKMeans.cluster_centers_
ordered_colors = [centroids[i] for i in counts.keys()]
hex_colors = [RGB2HEX(ordered_colors[i]) for i in counts.keys()]
rgb_colors = [ordered_colors[i] for i in counts.keys()]
if (show_chart):
plt.figure(figsize = (8, 6))
plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)
plt.show()
if (show_segmented_img):
centroids = np.uint8(centroids)
segmented_data = centroids[labels.flatten()]
segmented_image = segmented_data.reshape(img.shape)
segmented_image = cv2.cvtColor(segmented_image, cv2.COLOR_RGB2BGR)
cv2.imwrite('segmentedImg.png', segmented_image)
return hex_colors, rgb_colors
有人可以幫幫我嗎?
非常感謝!
編輯:來自 Hihikomori 的回答。
從 Hihikomori 的回答中,我知道我應該執行以下操作,這是基於我之前鏈接的問題,但問題是我得到了 3 個沒有任何輪廓的黑色面具,所以我認為這不適合我。
def get_colors(img, number_of_colors, show_chart, show_segmented_img):
modified_image = img.reshape(img.shape[0]*img.shape[1], 3)
myKMeans = KMeans(n_clusters = number_of_colors)
labels = myKMeans.fit_predict(modified_image)
counts = Counter(labels)
centroids = myKMeans.cluster_centers_
ordered_colors = [centroids[i] for i in counts.keys()]
hex_colors = [RGB2HEX(ordered_colors[i]) for i in counts.keys()]
rgb_colors = [ordered_colors[i] for i in counts.keys()]
# TRYING THE ASNWER
color1, color2,color3 = rgb_colors
first_color_indices = np.where(np.all(img == color1, axis=-1))
second_color_indices = np.where(np.all(img == color2, axis=-1))
third_color_indices = np.where(np.all(img == color3, axis=-1))
img1 = np.zeros_like(img)
img1[first_color_indices]=color1
img2 = np.zeros_like(img)
img2[second_color_indices]=color2
img3 = np.zeros_like(img)
img3[third_color_indices]=color3
print('***')
cv2_imshow(img1)
print('***')
cv2_imshow(img2)
print('***')
cv2_imshow(img3)
print('***')
if (show_chart):
plt.figure(figsize = (8, 6))
plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)
plt.show()
if (show_segmented_img):
centroids = np.uint8(centroids)
segmented_data = centroids[labels.flatten()]
segmented_image = segmented_data.reshape(img.shape)
segmented_image = cv2.cvtColor(segmented_image, cv2.COLOR_RGB2BGR)
cv2.imwrite('segmentedImg.png', segmented_image)
return hex_colors, rgb_colors
您可以使用np.unique()
在圖像中找到獨特的顏色,然后對其進行迭代,將每個像素設置為白色或黑色,具體取決於它是否等於該顏色:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image
im = cv2.imread('cheese.png')
# Reshape into a tall column of pixels, each with 3 RGB pixels and get unique rows (colours)
colours = np.unique(im.reshape(-1,3), axis=0)
# Iterate over the colours we found
for i,colour in enumerate(colours):
print(f'DEBUG: colour {i}: {colour}')
res = np.where((im==colour).all(axis=-1),255,0)
cv2.imwrite(f'colour-{i}.png', res)
樣品 Output
DEBUG: colour 0: [0 0 0]
DEBUG: colour 1: [0 141 196]
DEBUG: colour 2: [1 102 133]
color1 = (0,0,160)
color2 = (0,160,160)
color3 = (160,160,160)
img = np.zeros((640,480,3),np.uint8)
img[100:200,100:200] = color1
img[150:250,150:250] = color2
img[200:300,200:300] = color3
first_color_indices = np.where(np.all(img == color1,axis=-1))
second_color_indices = np.where(np.all(img == color2,axis=-1))
third_color_indices = np.where(np.all(img == color3,axis=-1))
img1 = np.zeros_like(img)
img1[first_color_indices]=color1
img2 = np.zeros_like(img)
img2[second_color_indices]=color2
img3 = np.zeros_like(img)
img3[third_color_indices]=color3
cv2.imshow('origin', img)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.