聚类图像分割
K均值聚类是一种常用的聚类算法,它将图像像素分为K个不同的群集,以使每个群集内的像素具有相似的颜色或强度。这可以用于分割具有不同颜色或亮度的对象。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import cv2# 读取图像
image = cv2.imread('1.png')# 将图像像素转换为特征向量
rows, cols, channels = image.shape
features = image.reshape(rows * cols, channels)# 使用K均值聚类
num_clusters = 2
kmeans = KMeans(n_clusters=num_clusters)
kmeans.fit(features)# 获取聚类中心和标签
centroids = kmeans.cluster_centers_
labels = kmeans.labels_# 重构图像
reconstructed_image = centroids[labels].reshape(rows, cols, channels)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.title('Original Image')
plt.imshow(image)
plt.axis('off')plt.subplot(122)
plt.title('Clustered Image')
plt.imshow(reconstructed_image.astype(np.uint8))
plt.axis('off')plt.show()
HSV空间颜色分割
HSV(色相、饱和度、明度)颜色空间是一种常用于图像处理和计算机视觉中的颜色表示方法。在HSV颜色空间中,颜色信息被分成三个成分:
-
H(色相):表示颜色的类型或种类。它以角度度量颜色的类型,从0°到360°,对应于不同的颜色,如红色、绿色、蓝色等。例如,0°是红色,120°是绿色,240°是蓝色。
-
S(饱和度):表示颜色的鲜艳程度或纯度。S值为0表示灰阶色,而S值为1表示完全饱和的颜色。饱和度值介于0和1之间。
-
V(明度):表示颜色的亮度。V值为0表示黑色,V值为1表示最大亮度的颜色。明度值介于0和1之间。
HSV颜色空间非常适合进行颜色分割,因为它将颜色信息与亮度信息分开,使得颜色分割更容易。在进行HSV颜色分割时,通常可以根据色相(H)和饱和度(S)来选择感兴趣的颜色范围,并将其分割出来。
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取彩色图像
image = cv2.imread('1.png')# 将图像转换到HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定义亮绿色和浅绿色的HSV范围
bright_green_lower = np.array([38, 120, 100])
bright_green_upper = np.array([80, 255, 255])pale_green_lower = np.array([35, 100, 100])
pale_green_upper = np.array([40, 255, 255])# 创建颜色掩膜
bright_green_mask = cv2.inRange(hsv_image, bright_green_lower, bright_green_upper)
pale_green_mask = cv2.inRange(hsv_image, pale_green_lower, pale_green_upper)# 合并掩膜,得到亮绿色和浅绿色区域
green_regions = cv2.bitwise_or(bright_green_mask, pale_green_mask)# 提取绿色区域
green_image = cv2.bitwise_and(image, image, mask=green_regions)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(231)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')plt.subplot(232)
plt.imshow(pale_green_mask, cmap='gray')
plt.title('pale Green Mask')
plt.axis('off')plt.subplot(233)
plt.imshow(cv2.cvtColor(green_image, cv2.COLOR_BGR2RGB))
plt.title('Green Regions')
plt.axis('off')plt.subplot(234)
plt.imshow(cv2.cvtColor(bright_green_mask, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()
for i in range(height):for j in range(150):if(pale_green_mask[i][j]==255):pale_green_mask[i][j]=0
pale_green_maskplt.figure(figsize=(12, 6))
plt.subplot(234)
plt.imshow(cv2.cvtColor(pale_green_mask, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()
#膨胀
pale_green_mask2=pale_green_mask
kernel_size = 2
kernel = np.ones((kernel_size, kernel_size), np.uint8)# 执行膨胀
pale_green_mask2 = cv2.dilate(pale_green_mask2, kernel, iterations=2)plt.figure(figsize=(12, 6))
plt.subplot(234)
plt.imshow(cv2.cvtColor(pale_green_mask2, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()