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

RGB空间中的彩色图像分割

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

概述

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

核心思想

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

欧氏距离

D(z,α)=∥z−α∥=[(z−α)T(z−α)]12=[(zR−aR)2+(zG−aG)2+(zB−aB)2]12D(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αzzz的RGB分量。满足D(z,α)≤D0D(z,\alpha)\le D_0D(z,α)D0的点的轨道是半径为D0D_0D0的实心球体,包含在球体内部和表面上的点满足指定的色彩准则。对图像中两组点进行二值化,就产生了一幅二值分割图像。

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

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

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

在这里插入图片描述

曼哈顿距离

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

单通道曼哈顿距离

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

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

需要满足的色彩准则为:

DMR≤ησRD_{MR} \le \eta \sigma _RDMRησR

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

多通道曼哈顿距离

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

DM(z,α)=∣∣z−α∣∣L1=∣zR−αR∣+∣zG−αG∣+∣zB−α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

DM≤η∣∣σ∣∣L1D_{M} \le \eta \ ||\sigma ||_{L1}DMη σL1

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

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

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

DMR≤ηRσRD_{MR} \le \eta_R \sigma _RDMRηRσR

DMG≤ηGσGD_{MG} \le \eta_G \sigma _GDMGηGσG

DMB≤ηBσBD_{MB} \le \eta_B \sigma _BDMBηBσB

实验和结果分析

import cv2
import numpy as np
import matplotlib.pyplot as pltimg = '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()

在这里插入图片描述

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.shapea = 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 - aDE = np.dot(d.T, d)if DE.sum() <= d0:b[h, w] = 1return bdef 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.shapefor c in range(C):g[:, :, c] = np.multiply(g[:, :, c], b)return g# Euclid distanceD0_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()

在这里插入图片描述

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.shapeb = 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] = 1return b# single red channel Manhattan distanceeta0 = 1.25
channel0 = 0g_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()

在这里插入图片描述

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

# multi-channel average Manhattan distancedef 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.shapea = 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 - aDM = np.sum(np.abs(d))if DM <= eta * sigmaL1:b[h, w] = 1return beta1 = 1.1g_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()

在这里插入图片描述

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

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.shapebs = np.zeros_like(f, dtype='int') # bs is the valid binarized matrix for each channel of ffor 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 = 1else:temp = 0b[w, h] = tempreturn b# RGBfig, 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()

在这里插入图片描述

# multi-channel weighted Manhattan distanceeta2 = (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()

在这里插入图片描述

使用多通道加权曼哈顿距离法,极大提升了计算的效率,并且获得了近似、甚至优于欧几里得距离法的结果!

参考文献

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路飞学城Python-Day171

Evernote Export 线性结构&#xff1a;python的列表操作列表是如何存储的&#xff1a;顺序存储的&#xff0c;是一块连续的内存&#xff0c;内存是一堆格子&#xff0c;列表是一串连续的编号32位机器上一个整数占4个字节数组和列表有2点不同&#xff0c;1.数组的元素类型要求是…

HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来

来源&#xff1a;21Tech(News-21)作者&#xff1a;倪雨晴编辑&#xff1a;张星6月2日晚间&#xff0c;华为鸿蒙操作系统HarmonyOS迎来重要时刻&#xff0c;华为正式发布多款搭载HarmonyOS 2的新产品&#xff0c;包括HUAWEI Mate 40系列新版本、Mate X2新版本、HUAWEI WATCH 3系…

操作系统:线程同步

操作系统&#xff1a;线程同步 使用Linux无名信号量实现了读写者线程的互斥和同步。 实验环境 环境&#xff1a;Linux语言&#xff1a;CCMake&#xff1a;3.17.1GCC&#xff1a;7.5.0IDE&#xff1a;Clion 2020.3.1 实验目标 理解进程同步的两种制约关系&#xff1a;互斥与…

中国工程院2021年院士增选第二轮候选人名单公布

来源&#xff1a;先进制造业中国工程院2021年院士增选进入第二轮评审候选人名单&#xff08;按候选人姓名拼音排序&#xff09;未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城…

vsftpd部署流程和常见问题详解

vsftpd部署流程和常见问题详解 ⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂&#xff0c;没有一篇是可以彻底解决问题的&#xff0c;有些问题虽简单&#xff0c;但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法&#xff0c;详述用户创建过…

谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

来源&#xff1a;Google AI Blog编辑&#xff1a;yaxin, LQ &#xff08;新智元&#xff09;突触&#xff0c;是神经网络的「桥梁」。我们知道&#xff0c;人类大脑有860亿个神经元&#xff0c;因为有了突触&#xff0c;才可以把神经元上的电信号传递到下一个神经元。长久以来&…

智慧食堂项目策划书(商业计划书/立项计划)

金鹰物联智慧食堂项目策划书&#xff08;商业计划书/立项计划&#xff09; ©️ 金鹰物联项目组&#xff0c;转载请注明出处&#xff01; ⭐️ 技术部分请参考博文&#xff1a;基于YOLOv5的中式快餐店菜品识别系统 文章目录金鹰物联智慧食堂项目策划书&#xff08;商业计划…

pipelineDB学习笔记-2. Stream (流)

一、流的定义&#xff1a; 所谓的“流”&#xff08;stream&#xff09;在pipelineDB中是指那些被允许的数据库客服端推送到 Continuous View&#xff08;连续视图&#xff09; 的时序化数据的一种“抽象”。流中的每一个raw(数据列)或者event(事件)&#xff0c;看起来是和普通…

银行家算法之Python实现[操作系统实验]

银行家算法 银行家算法是著名的死锁避免算法&#xff0c;其思想是&#xff1a;把操作系统视为银行家&#xff0c;操作系统管理的资源相当于银行家管理的资金&#xff0c;进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程…

城市智能化发展中,AI公司应该做什么?

来源&#xff1a;虎嗅APP题图来源:视觉中国在上海长宁区的部分区域&#xff0c;你会发现共享单车总是能够整整齐齐的排列&#xff0c;并且在每一个你需要的街道路边&#xff0c;都能找到空闲的单车&#xff0c;既不会车辆爆满&#xff0c;也不会无车可骑。这些城市细微之处的体…

getchar(),putchar()用法

1.getchar函数可以接收用户输入的多个字符&#xff0c;只用等用户按下回车键后&#xff0c;getchar()函数才会从键盘缓冲区依次读出字符&#xff1b; 2.getchar()和putchar()结合使用&#xff0c;可以将读取的字符输出到屏幕&#xff1b; 3.函数原型&#xff1a; int getchar…

[操作系统]页面置换算法实验及C++实现(OPT、FIFO、LRU)

虚拟内存页面置换算法实验&#xff08;OPT、FIFO、LRU&#xff09; 进程运行时&#xff0c;若其访问的页面不再内存中而需将其调入&#xff0c;但内存已无空闲空间时&#xff0c;就需要从内存中调出一页程序或数据&#xff0c;送入磁盘的对换区。选择调出页面的算法就称为页面…

智谱AI多项成果惊艳亮相2021北京智源大会

来源&#xff1a;学术头条2021 年 6 月 1 日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称 “智源”&#xff09;主办的 2021 北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。包括 Yoshua Bengio、David Patterson 等图灵奖获得者在内的两百余位国…

python-字典方法

1.字典的格式化字符串在转换说明符%后面加上键(圆括号括起来)&#xff1b;phonebook{"A":45,"B":"56"} s"As phone number is %(A)s." print(s%phonebook) 运行结果&#xff1a; #字典方法&#xff1a; #clear():清楚字典中的所有的项…

获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的

来源&#xff1a;Pinterest优选2019年初NHK的一个访谈纪录片&#xff0c;看哭了很多网友。“感动&#xff0c;这才是真正的大神啊&#xff01;”纪录片的主人公&#xff0c;是2002年的诺贝尔化学奖得主——田中耕一。十九年前&#xff0c;他的获奖几乎是“都市传说”般的爆炸新…

光辉岁月:人工智能的那些人和事(1)

来源&#xff1a;图灵人工智能源头茫昧虽难觅&#xff0c;活水奔流喜不休。——法国数学家亨利庞加莱&#xff08;Henri Poincare&#xff09;目前&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;正在迅速崛起。现已面世的AI应用&#xff…

MySQL主从架构及读写分离实战

​​​​​​ 目录 一、实验目的与环境 二、基础环境介绍 三、搭建主从集群 1、理论基础 2、同步的原理 3、搭建主从集群 3.1 配置master主服务器 3.2 配置slave从服务 3.3 主从集群测试 3.4 集群搭建扩展&#xff1a; 3.5、GTID同步集群 4、集群扩容 5、半同步复…

编译原理课程实践——实现一个初等函数运算语言的解释器或编译器

编译原理课程实践——实现具有初等函数运算语言的解释器或编译器 作者&#xff1a;Sylvan Ding &#xff5c;转载请注明文章出处&#xff01; 摘要&#xff1a;本文主要内容是设计词法分析器、语法分析器&#xff08;LL(1)、SLR(1)&#xff09;和语义分析器&#xff08;基于SL…

数据结构开发(3):线性表的顺序存储结构

0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList3.2 StaticList 和 DynamicList4.顺序存储线性表的分析 4.1 效率分析4.2 功能分析5.小结 1.线性表的本质和操作 线性表 ( List ) 的表现形式&#xff1a; 零个或多个数据元…

小目标检测的一些问题,思路和方案

来源&#xff1a;机器学习研究组订阅机器学习正越来越多地进入我们的日常生活。从个人服务的广告和电影推荐&#xff0c;到自动驾驶汽车和自动送餐服务。几乎所有的现代自动化机器都能“看”世界&#xff0c;但跟我们不一样。为了像我们人类一样看到和识别每个物体&#xff0c;…