用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-色度空间来分割绿色植物的目标,并针对每一步骤都进行了相应的讲解和代码示例,您学废了嘛!

相关推荐
WWZZ20253 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
2401_858869804 小时前
目标检测2
人工智能·目标检测·计算机视觉
ARM+FPGA+AI工业主板定制专家5 小时前
基于ZYNQ的目标检测算法硬件加速器优化设计
人工智能·目标检测·计算机视觉·fpga开发·自动驾驶
格林威5 小时前
UV紫外相机的简单介绍和场景应用
人工智能·数码相机·计算机视觉·视觉检测·制造·uv·工业相机
Python智慧行囊8 小时前
图像处理-opencv(二)-形态学
人工智能·计算机视觉
zenRRan9 小时前
用中等难度prompt做高效post training
人工智能·深度学习·机器学习·计算机视觉·prompt
格林威9 小时前
短波红外相机的简单介绍和场景应用
人工智能·数码相机·计算机视觉·目标跟踪·视觉检测·工业相机·工业镜头
~kiss~10 小时前
图像处理~多尺度边缘检测算法
图像处理·算法·计算机视觉
曾经的三心草10 小时前
OpenCV5-图像特征harris-sift-特征匹配-图像全景拼接-答题卡识别判卷
人工智能·opencv·计算机视觉
格林威11 小时前
可见光工业相机半导体制造领域中的应用
图像处理·人工智能·数码相机·计算机视觉·视觉检测·制造·工业相机