用OpenCV进行图像分割--进阶篇

1. 引言

大家好,我的图像处理爱好者们! 在上一篇幅中,我们简单介绍了图像分割领域中的基础知识,包含基于固定阈值的分割和基于OSTU的分割算法。这一次,我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。

闲话少说,我们直接开始吧!

2. RG-色度空间

基于色度的分割是指对每个像素的RGB值进行归一化处理,使我们的分割与光照条件无关。在开始之前,首先让我们讨论一下RG色度空间。它是一种二维的颜色表示,可以从我们的颜色中去除强度值,与标准的RGB空间的转化关系如下:

有的同学要问了,这里没有b, 实质上上述公式中, r 代表R在RGB中的占比,g代表G在RGB中的占比,剩下的 b 则是 1−r−g。

可视化出的结果图如下:

一般来说,我们可以RG色度空间应用到我们基础的图像分割任务中,我们接下来通过示例进行相关说明。

3. 导入样例图像

按照惯例,我们首先来导入本样例所需示例图像,代码如下:

cpp 复制代码
# Import the necessary libraries
from skimage.io import imread, imshow
import matplotlib.colors as colors
from skimage.color import rgb2gray
import matplotlib.pyplot as plt
import numpy as np
# Display the original image
original_image = imread('plants.jpg')
plt.figure(figsize=(20,20))
plt.imshow(original_image)
plt.title('Original Image', fontsize=20, weight='bold')
plt.show()

得到结果如下:

4. 转到RG色度空间

接着我们可以使用以下代码,实现原图到RG色度空间,代码如下:

cpp 复制代码
original_image_R = original_image[:,:,0]*1.0/original_image.sum(axis=2)
original_image_G = original_image[:,:,1]*1.0/original_image.sum(axis=2)

plt.figure(figsize=(20,20))
plt.scatter(original_image_R.flatten(),original_image_G.flatten())
plt.xlim(0,1)
plt.ylim(0,1);

结果如下:

5. 选择模板图像

这里我们选择一块绿色植物,作为我们的模板图像,代码如下:

cpp 复制代码
patch = original_image[3200:3300,2800:2900,:]
plt.figure(figsize=(10,10))
plt.imshow(patch)
plt.title('Reference Patch for Green', fontsize=20, weight='bold')
plt.axis('off');

结果如下:

接着,我们可以得到此模板图像的RG色度:

cpp 复制代码
patch_R = patch[:,:,0]*1.0/patch.sum(axis=2)
patch_G = patch[:,:,1]*1.0/patch.sum(axis=2)

plt.figure(figsize=(10,10))
plt.scatter(patch_R.flatten(),patch_G.flatten())
plt.xlim(0,1)
plt.ylim(0,1);

结果如下:

6. 计算高斯分布

接着我们需要做的事就是计算我们模板图像的高斯分布,来找到我们感兴趣的颜色。因此,我们用以下代码计算模板图像R通道的平均值和方差,如下:

cpp 复制代码
std_patch_R = np.std(patch_R.flatten())
mean_patch_R = np.mean(patch_R.flatten())

我们来可视化下R通道计算出来的结果,代码如下:

cpp 复制代码
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)
plt.plot(x,y);

画图如下:

这种分布为我们提供了使用R通道选择某种颜色作为图像表示的概率。我们实际上可以通过使用以下方法来利用该信息来分割我们的图像:

cpp 复制代码
prob_R = gaussian(original_image_R,mean_patch_R,std_patch_R)
plt.imshow(prob_R);

结果如下:

7. 分割图像

上面只是使用了RG-色度空间的R通道进行分割的结果,同时我们类比计算G通道的分割结果,

代码如下:

cpp 复制代码
std_patch_G = np.std(patch_G.flatten())
mean_patch_G = np.mean(patch_G.flatten())
prob_G = gaussian(original_image_G,mean_patch_G,std_patch_G)
plt.imshow(prob_G);

结果如下:

最后,我们考虑的两个通道是独立概率,我们可以简单地将掩码相乘:

cpp 复制代码
prob=prob_R * prob_G
plt.imshow(prob)

达到最终结果如下:

8. 总结

通过上述分析,我们一步一步实现了利用RG-色度空间来分割绿色植物的目标,并针对每一步骤都进行了相应的讲解和代码示例,您学废了嘛!

相关推荐
AI科技星21 分钟前
强哥德巴赫猜想(1+1)终极证明(2026 年5月 21 日)
开发语言·人工智能·算法·计算机视觉·量子计算
星越华夏7 小时前
计算机视觉:YOLOv12安装环境
人工智能·yolo·计算机视觉
Terrence Shen14 小时前
大模型部署工具对比
人工智能·深度学习·计算机视觉
AI算法沐枫16 小时前
大模型 | 大模型之机器学习基本理论
人工智能·python·神经网络·学习·算法·机器学习·计算机视觉
埃菲尔铁塔_CV算法16 小时前
YOLO11 与传统纹理特征融合目标检测 完整实现教程
人工智能·神经网络·yolo·计算机视觉
松☆18 小时前
ops-transformer:FlashAttention算子深度实践
人工智能·计算机视觉·目标跟踪
普密斯科技19 小时前
在线图像测量仪实战案例:医疗西林瓶尺寸检测的精准解决方案
大数据·人工智能·计算机视觉·健康医疗·测量
AI人工智能+19 小时前
不动产权证书识别技术:融合了计算机视觉、自然语言处理(NLP)和人工智能的深度技术栈
人工智能·计算机视觉·语言模型·ocr·不动产权证书识别
Hua-Jay21 小时前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
凌峰的博客21 小时前
T2SMark:在扩散模型噪声水印中寻找鲁棒性与多样性的平衡
人工智能·深度学习·计算机视觉