根据颜色分割图像
split image on the basis of color
我在应用 k-means 后获得了一个图像,簇 = 3。现在我想根据 k-means 后获得的颜色获得 3 个单独的图像。
例如,考虑附加的图像。现在我需要
一张图片,它只包含蓝色方块。
一个有字母 v,一个只有背景
有什么可能的方法可以使用 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 值)
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
我在应用 k-means 后获得了一个图像,簇 = 3。现在我想根据 k-means 后获得的颜色获得 3 个单独的图像。 例如,考虑附加的图像。现在我需要 一张图片,它只包含蓝色方块。 一个有字母 v,一个只有背景 有什么可能的方法可以使用 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 值)
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