前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于OpenCV实战的图像处理:色度分割

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

作者头像
小白学视觉
发布2021-05-07 11:05:59
1.3K0
发布2021-05-07 11:05:59
举报
文章被收录于专栏:深度学习和计算机视觉

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

  • 可以获得RGB / HSV通道之间的比率。
  • 可以使用由辅助颜色和其他颜色的混合物组成的目标色块。

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

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

代码语言:javascript
复制
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的代码实现如下实现:

代码语言:javascript
复制
#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)

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

— — 完 — —

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档