RGB空间中的彩色图像分割原理及其python实现

这篇具有很好参考价值的文章主要介绍了RGB空间中的彩色图像分割原理及其python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RGB空间中的彩色图像分割

⭐️ 为尊重原创性!转载请注明出处:©️ Sylvan Ding’s Blog

概述

本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法,并用python实现了各个算法。之后将二者的优势结合,提出了改进后的曼哈顿距离算法:基于加权曼哈顿距离的彩色图像分割算法,在分割效果和速度上超越了传统的欧式距离分割算法。

核心思想

在一幅RGB图像中分割某个指定的颜色区域(bbox)的物体。给定一个感兴趣的有代表性色彩的彩色样点集,可得到我们希望分割的颜色的“平均”估计。平均彩色用RGB向量 α \alpha α表示,分割的目的是将图像中每个RGB像素分类,即在指定的区域内是否有一种颜色。为了执行这一比较,需要有相似性度量:欧氏距离和曼哈顿距离。

欧氏距离

D ( z , α ) = ∥ z − α ∥ = [ ( z − α ) T ( z − α ) ] 1 2 = [ ( z R − a R ) 2 + ( z G − a G ) 2 + ( z B − a B ) 2 ] 1 2 D(z, \alpha)=\|z-\alpha\|=\left[(z-\alpha)^{\mathrm{T}}(z-\alpha)\right]^{\frac{1}{2}}=\left[\left(z_{R}-a_{R}\right)^{2}+\left(z_{G}-a_{G}\right)^{2}+\left(z_{B}-a_{B}\right)^{2}\right]^{\frac{1}{2}} D(z,α)=zα=[(zα)T(zα)]21=[(zRaR)2+(zGaG)2+(zBaB)2]21

其中,下标R、G、B表示向量 α \alpha α z z z的RGB分量。满足 D ( z , α ) ≤ D 0 D(z,\alpha)\le D_0 D(z,α)D0的点的轨道是半径为 D 0 D_0 D0的实心球体,包含在球体内部和表面上的点满足指定的色彩准则。对图像中两组点进行二值化,就产生了一幅二值分割图像。

有时会对欧氏距离进行推广,一种推广形式就是 D ( z , α ) = [ ( z − α ) T C − 1 ( z − α ) ] 1 / 2 D(z,\alpha)=[(z-\alpha)^TC^{-1}(z-\alpha)]^{1/2} D(z,α)=[(zα)TC1(zα)]1/2,其中 C C C是表示我们希望分割的有代表性颜色的样本的协方差矩阵,描述了一个椭球体,其主轴面向最大数据扩展方向。当 C = I 3 × 3 C=I_{3\times 3} C=I3×3时,上式退化为“球形”欧氏距离。

由于欧式距离是正的且单调的,所以可用距离的平方运算来代替,从而避免开方运算,所以我们最终的欧氏距离表达式为:

D E ( z , α ) = ( z − α ) T ( z − α ) D_E(z,\alpha)=(z-\alpha)^T(z-\alpha) DE(z,α)=(zα)T(zα)

RGB空间中的彩色图像分割原理及其python实现

曼哈顿距离

但是,上式计算代价较高,故使用曼哈顿距离(RGB空间中的盒边界)可以大幅降低计算代价。其核心思想是在盒中心 α \alpha α处,沿每一个颜色轴选择的维数与沿每个轴的样本的标准差成比例,标准差的计算只使用一次样本颜色数据。

单通道曼哈顿距离

在单通道上(以R通道为例),曼哈顿距离的定义为:

D M R ( z R , α R ) = ∣ z R − α R ∣ D_{MR}(z_R,\alpha_R)=|z_R-\alpha _R| DMR(zR,αR)=zRαR

需要满足的色彩准则为:

D M R ≤ η σ R D_{MR} \le \eta \sigma _R DMRησR

其中, σ R \sigma _R σR是样本点红色分量的标准差, η \eta η是标准差的系数,通常取 1.25 1.25 1.25

多通道曼哈顿距离

根据上述定义,多通道平均曼哈顿距离如下:

D M ( z , α ) = ∣ ∣ z − α ∣ ∣ L 1 = ∣ z R − α R ∣ + ∣ z G − α G ∣ + ∣ z B − α B ∣ D_{M}(z,\alpha)=||z-\alpha ||_{L1}=|z_R-\alpha _R|+|z_G-\alpha _G|+|z_B-\alpha _B| DM(z,α)=zαL1=zRαR+zGαG+zBαB

D M ≤ η   ∣ ∣ σ ∣ ∣ L 1 D_{M} \le \eta \ ||\sigma ||_{L1} DMη σL1

其中, σ = ( σ R , σ G , σ B ) \sigma=(\sigma _R,\sigma _G,\sigma _B) σ=(σR,σG,σB)是三通道各自的标准差向量。

多通道曼哈顿距离的改进:带权多通道曼哈顿距离

为R、G、B每个通道设定各自的 η \eta η,则需要满足的色彩标准为:

D M R ≤ η R σ R D_{MR} \le \eta_R \sigma _R DMRηRσR

D M G ≤ η G σ G D_{MG} \le \eta_G \sigma _G DMGηGσG

D M B ≤ η B σ B D_{MB} \le \eta_B \sigma _B DMBηBσB

实验和结果分析

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = 'strawberry_color.bmp'
f_bgr = cv2.imread(img, cv2.IMREAD_COLOR)
f_rgb = cv2.cvtColor(f_bgr, cv2.COLOR_BGR2RGB)

bndbox = {'xmin': 3,
          'ymin': 18,
          'xmax': 317,
          'ymax': 344}

f_rec = cv2.rectangle(f_rgb.copy(),
                      (bndbox['xmin'], bndbox['ymin']),
                      (bndbox['xmax'], bndbox['ymax']),
                      color=(255, 255, 0), thickness=5)

plt.imshow(f_rec)
plt.show()

RGB空间中的彩色图像分割原理及其python实现

def Euclid(f, box, d0):
    """
    Calculate Euclid distance and return binarized image
    :param f: img
    :param box: (xmin, ymin, xmax, ymax) # VOC format
    :param d0: condition
    :return: binarized image according to condition
    """
    H, W, C = f.shape
    a = np.zeros(C, dtype='float')
    b = np.zeros((H, W), dtype='int')

    for c in range(C):
        a[c] = np.mean(f[box[0]:box[2], box[1]:box[3] ,c])

    a = a.reshape(C, 1)

    for w in range(W):
        for h in range(H):
            z = f[h, w, :].reshape(C, 1)
            d = z - a
            DE = np.dot(d.T, d)
            if DE.sum() <= d0:
                b[h, w] = 1

    return b


def binary_mix(f, b):
    """
    mix input image and binarized image
    :param f: input image
    :param b: its binarized image with only two values 0 and 1
    :return: g
    """
    g = f.copy()
    H, W, C = g.shape

    for c in range(C):
        g[:, :, c] = np.multiply(g[:, :, c], b)

    return g


# Euclid distance

D0_0 = 5000
g_u_b_0 = Euclid(f_rgb, list(bndbox.values()), d0=D0_0)

D0_1 = 10000
g_u_b_1 = Euclid(f_rgb, list(bndbox.values()), d0=D0_1)

fig, axs = plt.subplots(2, 2, figsize=(10, 10))

axs[0][0].set_title('g_u_b_0: D0={}'.format(D0_0))
axs[0][0].imshow(g_u_b_0, cmap='gray')
axs[0][1].set_title('binary_mix(f_rgb, g_u_b_0): D0={}'.format(D0_0))
axs[0][1].imshow(binary_mix(f_rgb, g_u_b_0))

axs[1][0].set_title('g_u_b_1: D0={}'.format(D0_1))
axs[1][0].imshow(g_u_b_1, cmap='gray')
axs[1][1].set_title('binary_mix(f_rgb, g_u_b_1): D0={}'.format(D0_1))
axs[1][1].imshow(binary_mix(f_rgb, g_u_b_1))

plt.suptitle('Euclid distance')
plt.show()

RGB空间中的彩色图像分割原理及其python实现

def single_Manhattan(f, box, eta, channel=0):
    """
    Calculate single channel Manhattan distance and return binarized image
    :param f: img
    :param box: (xmin, ymin, xmax, ymax) # VOC format
    :param eta: condition
    :param channel: int, channel number
    :return: binarized image according to condition
    """
    H, W, C = f.shape
    b = np.zeros((H, W), dtype='int')
    c = f[box[0]:box[2], box[1]:box[3] , channel]
    a = np.mean(c)
    sigma = np.std(c)

    for w in range(W):
        for h in range(H):
            z = f[h, w, channel]
            if np.abs(z - a) <= eta * sigma:
                b[h, w] = 1

    return b


# single red channel Manhattan distance

eta0 = 1.25
channel0 = 0

g_m_b_0 = single_Manhattan(f_rgb, list(bndbox.values()), eta=eta0, channel=channel0)

fig, axs = plt.subplots(2, 2, figsize=(10, 10))

axs[0][0].set_title('origin')
axs[0][0].imshow(f_rgb)
axs[0][1].set_title('origin with single channel: channel={}'.format(channel0))
axs[0][1].imshow(f_rgb[:, :, channel0], cmap='Reds')

axs[1][0].set_title(r'g_m_b_0: \eta={}'.format(eta0))
axs[1][0].imshow(g_m_b_0, cmap='gray')
axs[1][1].set_title(r'binary_mix(f_rgb, g_m_b_0): \eta={}'.format(eta0))
axs[1][1].imshow(binary_mix(f_rgb, g_m_b_0))

plt.suptitle('single red channel Manhattan distance')
plt.show()

RGB空间中的彩色图像分割原理及其python实现

基于红色单通道的曼哈顿距离法不能很好地划分背景和草莓,这是因为在红色通道下,背景和草莓的红色值相近(图b说明了这一事实)。

# multi-channel average Manhattan distance

def multi_avg_Manhattan(f, box, eta):
    """
    Calculate multi-channel average Manhattan distance and return binarized image
    :param f: img
    :param box: (xmin, ymin, xmax, ymax) # VOC format
    :param eta: condition
    :return: binarized image according to condition
    """
    H, W, C = f.shape
    a = np.zeros(C, dtype='float')
    sigma = np.zeros(C, dtype='float')
    b = np.zeros((H, W), dtype='int')

    for c in range(C):
        sam = f[box[0]:box[2], box[1]:box[3] ,c]
        a[c] = np.mean(sam)
        sigma[c] = np.std(sam)

    sigmaL1 = np.sum(sigma)

    a = a.reshape(C, 1)

    for w in range(W):
        for h in range(H):
            z = f[h, w, :].reshape(C, 1)
            d = z - a
            DM = np.sum(np.abs(d))
            if DM <= eta * sigmaL1:
                b[h, w] = 1

    return b


eta1 = 1.1

g_m_b_1 = multi_avg_Manhattan(f_rgb, list(bndbox.values()), eta=eta1)

fig, axs = plt.subplots(1, 2, figsize=(10, 5))

axs[0].set_title(r'g_m_b_1: \eta={}'.format(eta1))
axs[0].imshow(g_m_b_1, cmap='gray')
axs[1].set_title(r'binary_mix(f_rgb, g_m_b_1): \eta={}'.format(eta1))
axs[1].imshow(binary_mix(f_rgb, g_m_b_1))

plt.suptitle('multi-channel average Manhattan distance')
plt.show()

RGB空间中的彩色图像分割原理及其python实现

可以看到,"平均多通道"曼哈顿法优于"红色单通道"曼哈顿法。

def multi_weight_Manhattan(f, box, etas):
    """
    Calculate multi-channel weighted Manhattan distance and return binarized image
    :param f: img
    :param box: (xmin, ymin, xmax, ymax) # VOC format
    :param etas: conditions for each channel like (eta0, eta1, eta2)
    :return: binarized image according to condition
    """
    H, W, C = f.shape
    bs = np.zeros_like(f, dtype='int') # bs is the valid binarized matrix for each channel of f

    for c in range(C):
        bs[:, :, c] = single_Manhattan(f, box, etas[c], c)

    b = np.sum(bs, axis=2)

    for w in range(W):
        for h in range(H):
            if b[w, h] == C:
                temp = 1
            else:
                temp = 0
            b[w, h] = temp

    return b


# RGB

fig, axs = plt.subplots(1, 3, figsize=(10, 4))

axs[0].set_title('R')
axs[0].imshow(f_rgb[:, :, 0], cmap='gray')
axs[1].set_title('G')
axs[1].imshow(f_rgb[:, :, 1], cmap='gray')
axs[2].set_title('B')
axs[2].imshow(f_rgb[:, :, 2], cmap='gray')

plt.suptitle('RGB')
plt.show()

RGB空间中的彩色图像分割原理及其python实现

# multi-channel weighted Manhattan distance

eta2 = (1.4, 1.1, 1.3)

g_m_b_2 = multi_weight_Manhattan(f_rgb, list(bndbox.values()), etas=eta2)

fig, axs = plt.subplots(1, 2, figsize=(10, 5))

axs[0].set_title('g_m_b_2')
axs[0].imshow(g_m_b_2, cmap='gray')
axs[1].set_title('binary_mix(f_rgb, g_m_b_2)')
axs[1].imshow(binary_mix(f_rgb, g_m_b_2))

plt.suptitle(r'multi-channel weighted Manhattan distance: \etas={}'.format(str(eta2)))
plt.show()

RGB空间中的彩色图像分割原理及其python实现

使用多通道加权曼哈顿距离法,极大提升了计算的效率,并且获得了近似、甚至优于欧几里得距离法的结果!文章来源地址https://www.toymoban.com/news/detail-421830.html

参考文献

  1. 数字图像处理:第3版,北京:电子工业出版社

到了这里,关于RGB空间中的彩色图像分割原理及其python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 彩色图像灰度化 (RGB ⇒ Gray )(RGB ⇒ YUV)(Verilog)

    简介:         把一个彩色图像,也称为 RGB(红,绿,蓝)图像转化为灰度图像的行为称为彩色图像灰度化处理。也就是由原来的三个通道 RGB 转化为一个通道 YCrCb(从三个亮度值转换为一个亮度值), 也即 YUV(亮度,饱和度)的过程。常见的 24 位深度彩色图像 RGB888 中的每

    2024年01月25日
    浏览(34)
  • Matlab分割彩色图像

    彩色图像 彩色图像除有亮度信息外,还包含有颜色信息。以最常见的RGB(红绿蓝)彩色空间为例来简要说明彩色图像: 彩色图像可按照颜色的数目来划分。例如,256色图像和真彩色图像(2的16次方=216777216种颜色)等,通常RGB图像中每个像素都是用24位二进制数表示的,故也

    2024年02月11日
    浏览(26)
  • 深度图与RGB彩色图的对准(内附Python代码)

    在使用RealSense深度相机前,必须把深度相机和RGB相机 对准 了使用。。。不然会导致采集到的图像不对齐(如下图所示):             左边是RGB图像,右边是深度图像。  关于RealSense相机的校准,网上已经有了许多教程,这里就不再赘述。本文主要内容是如何处理 已采集

    2024年02月08日
    浏览(51)
  • Python-OpenCV中的图像处理-颜色空间转换

    在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR G r a y 和 BGR HSV。 注意:在 OpenCV 的 HSV 格式中, H(色彩/色度)的取值范围是 [0, 179],S(饱和度)的取值范围 [0, 255], V(亮度)的取值范围 [0,

    2024年02月13日
    浏览(29)
  • 图像分割Unet算法及其Pytorch实现

    UNet是一种用于图像分割的神经网络,由于这个算法前后两个部分在处理上比较对称,类似一个U形,如下图所示,故称之为Unet,论文链接:U-Net: Convolutional Networks for Biomedical Image Segmentation,全文仅8页。 从此图可以看出,左边的基础操作是两次 3 × 3 3times3 3 × 3 卷积后池化,

    2024年01月22日
    浏览(33)
  • 彩色图像处理之彩色图像直方图处理的python实现——数字图像处理

    彩色图像的直方图处理是一种重要的图像处理技术,用于改善图像的视觉效果,增强图像的对比度,或为后续的图像处理任务(如图像分割、特征提取)做准备。彩色图像通常由红色(R)、绿色(G)、蓝色(B)三个颜色通道组成,因此彩色图像的直方图处理相比单色图像更

    2024年01月23日
    浏览(48)
  • 《图像分割Unet网络分析及其Pytorch版本代码实现》

      最近两个月在做学习图像分割方面的学习,踩了无数的坑,也学到了很多的东西,想了想还是趁着国庆节有时间来做个总结,以后有这方面需要可以来看看。   神经网络被大规模的应用到计算机视觉中的分类任务中,说到神经网络的分类任务这里不得不提到CNN(卷积神经网

    2024年02月05日
    浏览(33)
  • 【音视频原理】图像相关概念 ③ ( RGB 色彩简介 | RGB 排列 | YUV 色彩简介 | YUV 编码好处 )

    RGB 是 计算机 中的 颜色编码方法 , 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 可以设置不同的值 , 每个 通道 的 颜色值都可以取值 0 ~ 255 , 这样 三个通道 叠加 , 可以表示出 25 6 3 = 16777216 256 ^3 = 16777216 25 6 3 = 16777216 种颜色值 ; 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 都取值 255

    2024年01月20日
    浏览(50)
  • RGB彩色图、Depth深度图

    💦彩色图,深度图——》信息缺乏。如,颜色相近导致位置信息丢失 💦深度图——》相近深度的物体,因为颜色或纹理的丢失,导致难区分 深度图并不可以直接使用, 因为深度图只能反映出了物体在三维空间中一个方向上的信息,即拍摄场景中各个点到相机的距离。这个

    2024年02月02日
    浏览(29)
  • opencv 05 彩色RGB像素值操作

    RGB 模式的彩色图像在读入 OpenCV 内进行处理时,会按照行方向依次读取该 RGB 图像的 B 通道、G 通道、R 通道的像素点,并将像素点以行为单位存储在 ndarray 的列中。例如, 有一幅大小为 R 行×C 列的原始 RGB 图像,其在 OpenCV 内以 BGR 模式的三维数组形式存储, 如图 2-7 所示 可

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包