基于OpenCV实战的图像处理:色度分割
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法。为什么大多数人偏爱色度而不是RGB / HSV分割?
可以获得RGB / HSV通道之间的比率。
可以使用由辅助颜色和其他颜色的混合物组成的目标色块。
我们将色度分割定义为利用RG通道的色度空间从图像中提取目标的过程。后者构成了一个二维颜色表示,它忽略了与强度值相关的图像信息。我们通过观察不同颜色通道的比例来实现这一点,并使用标准化的RGB空间来映射它。因此,为了计算图像的RG色度,我们使用以下方程式:
我们主要只看r和g方程,因为从那里我们可以直观地计算b通道,让我们使用我们的老朋友Python将色度分割付诸实践。在继续执行之前,请安装以下库:
from skimage.io import imread, imshow
import matplotlib.pyplot as plt
import numpy as np
本文实践操作将使用此图像:
图像处理步骤:
步骤1:计算图像的RG色度
这是通过使用引言中定义的方程式完成的。
步骤2:计算颜色值的2D直方图(原始图像)
这是通过使R和色度值均变平并将其输入hist2d函数中来实现的。
通过这一点,可以注意到什么颜色或一组颜色构成了我们的图像。
步骤3:选择参考图片补丁
从感兴趣的对象生成补丁。在这种情况下,我们将草莓细分。因此,将要选择的补丁将是草莓的补丁。
步骤4:计算补丁的RG色度
重复步骤1,但在步骤3中使用图像补丁
步骤5:计算颜色值的2D直方图(色标)
重复步骤2,但在步骤3中使用图像
到目前为止,我们已经获得了相关图像的RG色度值。现在,我们进行下一步-参数分割。
第6步:参数细分
此步骤要求我们拟合高斯分布,该分布将确定属于感兴趣颜色的像素。在执行此操作之前,应从感兴趣的对象(参考补丁)计算平均值和标准偏差。然后将这些反馈给高斯分布函数。
步骤1-6的代码实现如下实现:
#image chromaticity values
fruits_R = fruits[:,:,0]*1.0/fruits.sum(axis=2)
fruits_G = fruits[:,:,1]*1.0/fruits.sum(axis=2)
#patch
patch_strw = fruits[60:90,50:90,:]
#patch chromaticity values
patch_R = patch_strw[:,:,0]*1.0/patch_strw.sum(axis=2)
patch_G = patch_strw[:,:,1]*1.0/patch_strw.sum(axis=2)
#mean and stdev calculation of patch
std_patch_R = np.std(patch_R.flatten())
mean_patch_R = np.mean(patch_R.flatten())
std_patch_G = np.std(patch_G.flatten())
mean_patch_G = np.mean(patch_G.flatten())
#gaussian function
def gaussian(p,mean,std):
return np.exp(-(p-mean)**2/(2*std**2))*(1/(std*((2*np.pi)**0.5)))
x = np.linspace(0,1)
y = gaussian(x,mean_patch_R,std_patch_R)
#plotting
fig, ax = plt.subplots(2, 3, figsize=(20, 7))
ax[0,0].scatter(fruits_R.flatten(),fruits_G.flatten())
ax[0,0].set_title('RG Chromaticity', size=14)
ax[0,1].hist2d(fruits_R.flatten(), fruits_G.flatten(),
bins=100,cmap='binary');
ax[0,1].set_title('Color Values 2D Histogram', size=14)
ax[0,2].imshow(patch_strw)
ax[0,2].set_title('Strawberry Patch', size=14)
ax[1,0].scatter(patch_R.flatten(),patch_G.flatten())
ax[1,0].set_title('Patch RG Chromaticity', size=14)
ax[1,1].hist2d(patch_R.flatten(), patch_G.flatten(),
bins=100,cmap='binary')
ax[1,1].set_title('Patch Color Values 2D Histogram', size=14)
ax[1,2].plot(x,y)
ax[1,2].set_title('Gaussian Plot', size=14)
fig.suptitle('Strawberry', size = 30)
综上所述,类似于彩色图像分割方法,存在一个任意确定的阈值。尝试并尝试使用这些值,然后选择将返回最理想输出的值。同样,在最终图中,尽管草莓被清楚地分割了,但仍然捕获了无关的信息。这是进行形态学操作以方便进一步清洁图像的地方,因此分割与以往一样准确。
— — 完 — —
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~