基于OpenCV实战的图像处理:色度分割

共 3057字,需浏览 7分钟

 ·

2021-05-05 10:22

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法。为什么大多数人偏爱色度而不是RGB / HSV分割?

  • 可以获得RGB / HSV通道之间的比率。

  • 可以使用由辅助颜色和其他颜色的混合物组成的目标色块。


我们将色度分割定义为利用RG通道的色度空间从图像中提取目标的过程。后者构成了一个二维颜色表示,它忽略了与强度值相关的图像信息。我们通过观察不同颜色通道的比例来实现这一点,并使用标准化的RGB空间来映射它。因此,为了计算图像的RG色度,我们使用以下方程式:


我们主要只看r和g方程,因为从那里我们可以直观地计算b通道,让我们使用我们的老朋友Python将色度分割付诸实践。在继续执行之前,请安装以下库:

from skimage.io import imread, imshowimport matplotlib.pyplot as pltimport 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)

综上所述,类似于彩色图像分割方法,存在一个任意确定的阈值。尝试并尝试使用这些值,然后选择将返回最理想输出的值。同样,在最终图中,尽管草莓被清楚地分割了,但仍然捕获了无关的信息。这是进行形态学操作以方便进一步清洁图像的地方,因此分割与以往一样准确。

— — 完 — —



下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报