Python 3.x 基于颜色的图像分割
我已经获得了一个图像后,应用k-均值聚类=3。现在我想在k均值后获得的颜色的基础上获得3个单独的图像。 例如,考虑附加图像。现在我需要 一幅只包含蓝色正方形的图像。 一个字母是v,另一个只有背景Python 3.x 基于颜色的图像分割,python-3.x,opencv,image-processing,opencv3.0,Python 3.x,Opencv,Image Processing,Opencv3.0,我已经获得了一个图像后,应用k-均值聚类=3。现在我想在k均值后获得的颜色的基础上获得3个单独的图像。 例如,考虑附加图像。现在我需要 一幅只包含蓝色正方形的图像。 一个字母是v,另一个只有背景 使用OpenCV和python是否有任何可能的方法来实现这一点。您可以通过计算图像的直方图来解决此问题。 下图显示了图像的峰值 由此,可以设置颜色的阈值。代码和结果: import cv2 import numpy as np from matplotlib import pyplot as plt
使用OpenCV和python是否有任何可能的方法来实现这一点。您可以通过计算图像的直方图来解决此问题。 下图显示了图像的峰值 由此,可以设置颜色的阈值。代码和结果:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("inputs/hist.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray],[0],None,[256],[0,256])
colors = np.where(hist>5000)
img_number = 0
for color in colors[0]:
print(color)
split_image = img.copy()
split_image[np.where(gray != color)] = 0
cv2.imwrite(str(img_number)+".jpg",split_image)
img_number+=1
plt.hist(gray.ravel(),256,[0,256])
plt.savefig('plt')
plt.show()
结果:
最通用、最简单的方法是为每个区域使用三种独特的灰色。(虽然我可以在上面的图像中找到三个以上的灰度级,可能是由于imgur压缩导致的变化。不过,在一天结束时,k-means应该给出三个BGR值)
所以再做两个克隆。在一个例子中,让一切不是白色,黑色和保存。在另一种情况下,制作所有非蓝色、黑色等的图像。@MarkSetchell这只是一个示例图像,我不知道我将接收的颜色好的,随机选取像素,直到有3个不同的像素,或者从左上角开始,反复浏览,直到你有了3种不同的颜色。你能再贴几张图片进行测试吗?你不能使用标签图片而不是量化颜色图片吗?这将避免“反向工程”颜色。当两种或两种以上的颜色具有相同的亮度时,这将失败。@Yvesdao我们是否可以使用HSV颜色空间来解决此问题?没有必要切换到HSV。保留RGB。(事实上,使用标签图像会更好。)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
unique = np.unique(gray)
c1, c2, c3 = unique[0], unique[1], unique[2]
mask1 = np.zeros_like(gray)
mask1[gray == c1] = 255
mask2 = np.zeros_like(gray)
mask2[gray == c2] = 255
mask3 = np.zeros_like(gray)
mask3[mask3 == c3] = 255