基于彩色的图像分割

news2024/11/11 5:51:07

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 

HSI颜色空间中的分割

   HSI颜色空间是面向颜色处理的,用色调(H),饱和度(S)描述色彩,用亮度(I)描述光的强度。

  HSI模型的建立基于两个重要的事实: ① I分量与图像的彩色信息无关;② H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。

  

  假定感兴趣区域是原始RGB图像中的红色。观察H分量可以发现感兴趣区域具有较高的色调值。观察S分量图像可以发现感兴趣区域色彩饱和度较高。饱和度图像中选择门限等于最大饱和度30%,对于任何比门限大的像素赋值1(白),其他为0(黑)。可产生分割图像效果。

from skimage import data,io
from matplotlib import pyplot as plt
import math
import numpy as np
import sys


# 定义RGB图像转换为HSI图像函数
def rgb2hsi(r, g, b):
    r = r / 255
    g = g / 255
    b = b / 255
    num = 0.5 * ((r - g) + (r - b))
    den = ((r - g) * (r - g) + (r - b) * (g - b)) ** 0.5
    if b <= g:
        if den == 0:
            den = sys.float_info.min
        h = math.acos(num / den)
    elif b > g:
        if den == 0:
            den = sys.float_info.min
        h = (2 * math.pi) - math.acos(num / den)
    s = 1 - (3 * min(r, g, b) / (r + g + b))
    i = (r + g + b) / 3
    return int(h), int(s * 100), int(i * 255)


img=io.imread("F.jpg")

hsi = np.zeros(img.shape, dtype='uint8')
for ii in range(img.shape[0]):
    for jj in range(img.shape[1]):
        r, g, b = img[ii, jj, :]
        h, s, i = rgb2hsi(r, g, b)
        hsi[ii, jj:] = (h, s, i)
H = hsi[:, :, 0]
S = hsi[:, :, 1]
I = hsi[:, :, 2]
# 生成二值饱和度模板
S_template = np.zeros(S.shape, dtype='uint8')
for i in range(S.shape[0]):
    for j in range(S.shape[1]):
        if S[i, j] > 0.3 * S.max():
            S_template[i, j] = 1
# 色调图像与二值饱和度模板相乘可得分割结果F
F = np.zeros(H.shape, dtype='uint8')
for i in range(F.shape[0]):
    for j in range(F.shape[1]):
        F[i, j] = H[i, j] * S_template[i, j]
# 显示结果
plt.figure()
plt.axis('off')
plt.imshow(img)
# 显示H S I分量
plt.figure()
plt.axis('off')
plt.imshow(H, cmap='gray')
plt.figure()
plt.axis('off')
plt.imshow(S, cmap='gray')
plt.figure()
plt.axis('off')
plt.imshow(I, cmap='gray')
plt.figure()
plt.axis('off')
plt.imshow(S_template, cmap='gray')  # 二值饱和度模板
plt.figure()
plt.axis('off')
plt.imshow(F, cmap='gray')  # 分割结果
plt.show()

RGB图像:

H分量:

S分量:

 I分量:

二值饱和度模板:

分割结果:

 RGB颜色空间中的分割

   RGB是常用的描述彩色图像的颜色空间。RGB是颜色空间中分割算法是最直接的,得到的分割效果通常较好。假定感兴趣区域是红色伞,则可以选取一些可以代表红色伞的像素点组成样本集合,通过样本集对待分割的颜色的“平均”进行估计。用向量a表示平均颜色,向量z表示RGB空间任意像素颜色特征。若z与a的欧式距离小于给定阈值D_{0},则认为z与a相似。欧式距离需要开方,为了简化计算,使用边界盒,盒子中心在a处,盒子在RGB这三个维度长度和样本集在每个维度标准差成正比。z在盒子内,颜色特征为z在感兴趣区域,否则在不感兴趣区域。

from skimage import io
from matplotlib import pyplot as plt
import math
import numpy as np

img = io.imread("F.jpg")
r = img[:, :, 0]
g = img[:, :, 1]
b = img[:, :, 2]
# RGB颜色空间分割
# 选择样本区域
r1 = r[128:255, 85:169]
# 计算该区域彩色点平均向量a的红色分量
r1_u = np.mean(r1)
# 计算样本红色分量标准差
r1_d = 0.0
for i in range(r1.shape[0]):
    for j in range(r1.shape[1]):
        r1_d = r1_d + (r1[i, j] - r1_u) * (r1[i, j] - r1_u)
r1_d = math.sqrt(r1_d / r1.shape[0] / r1.shape[1])
# 寻找符合条件的点 r2为红色分割图像
r2 = np.zeros(r.shape, dtype='uint8')
for i in range(r.shape[0]):
    for j in range(r.shape[1]):
        if r[i, j] >= (r1_u - 1.25 * r1_d) and r[i, j] <= (r1_u + 1.25 * r1_d):
            r2[i, j] = 1
# img2根据红色分割后图像
img2 = np.zeros(img.shape, dtype='uint8')
for i in range(r.shape[0]):
    for j in range(r.shape[1]):
        if r2[i, j] == 1:
            img2[i, j, :] = img[i, j, :]
plt.subplot(121)
plt.title("RGB")
plt.imshow(img)
plt.subplot(122)
plt.title("R")
plt.imshow(r, cmap='gray')
plt.show()
plt.subplot(121)
plt.title("G")
plt.imshow(g, cmap='gray')
plt.subplot(122)
plt.title("B")
plt.imshow(b, cmap='gray')
plt.show()
plt.subplot(121)
plt.title("RED")
plt.imshow(r2, cmap='gray')
plt.subplot(122)
plt.title('split RGB')
plt.imshow(img2)
plt.show()

RGB与R分量:

G与B分量:

红色分割图像与分割后RGB图像:

      观察可以发现R分量红色区域亮度值较高,并且在R分量中红伞区域与背景比较明显,因此选取R分量作为分析对象。选取红伞一小块区域作为样本集,计算该区域的平均向量a的红色分量。当z的红色分量和平均向量的红色分量差值在一定范围内,判定z的像素点为感兴趣像素点,否则就是不感兴趣像素点。将感兴趣像素点保持原始亮度值,不感兴趣像素点亮度设为0(黑色),显示红色伞,弱化背景。

使用skimage库函数

  

  skimage是一个Python图像处理库,它提供了许多用于图像分析和处理的工具。你可以使用skimage来进行颜色分割,这意味着将图像中的不同颜色分开,以便进一步处理。

  为了进行颜色分割,你可以使用skimage中的color module。这个module提供了许多函数,可以用于转换颜色空间,提取颜色特征,进行颜色校正等。

 

from skimage import io, color
from skimage.filters import threshold_otsu
from matplotlib import pyplot as plt

# 读取RGB图像
image = io.imread('demo.jpg')

# 将图像转换为灰度图像
gray_image = color.rgb2gray(image)

# 对灰度图像进行二值化处理
threshold = threshold_otsu(gray_image)
binary_image = gray_image > threshold

# 将二值图像保存到文件
io.imsave('binary_image.jpg', binary_image)

# 读取RGB图像
img = io.imread('demo.jpg')
img1=io.imread("binary_image.jpg")
plt.subplot(121)
plt.title("RGB")
plt.imshow(img)
plt.subplot(122)
plt.title("Binary")
plt.imshow(img1,cmap='gray')
plt.show()

   其中,你可以使用rgb2gray函数将RGB图像转换为灰度图像,然后使用threshold_otsu函数对灰度图像进行二值化处理,从而进行颜色分割。

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

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

相关文章

小程序03/ uni-app认识目录结构 、uni-app应用生命周期 和 生命周期钩子、uni-app页面生命周期 和 生命周期钩子

一.uni-app认识目录结构 二.uni-app应用生命周期 和 生命周期钩子 位置: uni-app 在App.vue中监听 在页面监听无效 说明: App.vue是uni-app的主组件 所有页面都是在App.vue 下进行切换的、是页面入口文件 但是App.vue 本身不是页面 这里不能编写视图元素 也就是没有<tmpl…

Git(一) - Git 概述

01_尚硅谷_Git_课程介绍_哔哩哔哩_bilibili Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以高效的处理从小型到大型的各种项目。 一、何为版本控制 版本控制是一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 版本控制其实最主要的是可以…

java 瑞吉外卖优化day2 Nginx

Nginx概述 下载与安装 可以到Nginx官方网站下载Nginx的安装包&#xff0c;地址为&#xff1a;https://nginx.org/en/download.html 安装过程&#xff1a; 1、安装依赖包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel 先yum install wget &#xff0c;…

随机数 - 时间种子的方案与实践

1.应用场景 主要弄清楚设置随机数种子的方法&#xff0c;可用于游戏开发当中的时间种子从而产生合理的随机数&#xff0c;避免出现bug。 2.学习/操作 1.文档阅读 07 | 带你快速上手 Lua-极客时间 2.整理输出 2.1 什么是种子 现在很多朋友下载东西时都会用bt种子文件&#xff0…

5分钟带你学习 linux 收发邮件步骤详解 at命令详解 crontab命令详解 附加at crontab命令练习

linux 收发邮件步骤详解 1.安装软件yum install mailx -yyum install sendmail -y 2.启动服务sendmailsystemctl start sendmail 3.更改配置vim /etc/mail.rc at命令详解 实例&#xff1a; crontab命令详解 实例&#xff1a; linux 收发邮件步骤详解 1.安装软件 yum…

拜占庭将军问题

前言 在分布式系统中交换信息, 部分成员可能出错导致发送了错误的信息, 在这种情况下如何达成共识. 这就是拜占庭将军问题所要解决的. 问题的简要描述如下: 3个军队协同作战(为了简单易懂, 以3个军队描述)每支军队的作战策略有两种"进攻"和"撤退"每个军…

SparkLaunch提交Spark任务到Yarn集群

SparkLaunch提交任务1.提交Spark任务的方式2.SparkLaunch 官方接口3.任务提交流程及实战1.提交Spark任务的方式 通过Spark-submit 提交任务通过Yarn REST Api提交Spark任务通过Spark Client Api 的方式提交任务通过SparkLaunch 自带API提交任务基于Livy的方式提交任务&#xf…

深拷贝浅拷贝的区别?如何实现一个深拷贝

一、数据类型存储 前面文章我们讲到&#xff0c;JavaScript中存在两大数据类型&#xff1a; 基本类型引用类型 基本类型数据保存在在栈内存中 引用类型数据保存在堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;存在栈中 二、浅拷贝…

【2】SCI易中期刊推荐——遥感图像领域(2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

2022年最有开创性的10篇AI论文总结

2022年随着聊天GPT和Mid - journey和Dall-E等图像生成器的流行&#xff0c;我们看到了整个人工智能领域的重大进展。在人工智能和计算机科学的时代&#xff0c;这是令人振奋的一年。本文我们总结了在2022年发表的最具开创性的10篇论文&#xff0c;无论如何你都应该看看。 1、Al…

Apache Calcite初识

Calcite原理和代码讲解(一) https://blog.csdn.net/qq_35494772/article/details/118887267quickstart:Apache Calcite精简入门与学习指导 https://blog.51cto.com/xpleaf/2639844quickstart:多源数据的关联 csv和mem数据类型 https://cloud.tencent.com/developer/article/162…

【Javassist】快速入门系列14 使用Javassist导入包路径

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

CSS复习(一)

CSS复习1.前言2. CSS介绍2.1 CSS的引入方式2.2 选择器2.2 颜色的赋值方式3. 补充4.display4.1 盒子模型4.1.1 盒子模型之宽高盒子模型之外边距盒子模型之边框盒子模型之内边距4.2 文本问题1.前言 首先补充一下部分相关知识&#xff1a; 分区标签自身没有显示效果&#xff0c;…

【算法】kmp、Trie、并查集、堆

文章目录1.kmp2.Trie3.并查集4.堆1.kmp KMP 的精髓就是 next 数组&#xff1a;也就是用 next[j] k;简单理解就是&#xff1a;来保存子串某个位置匹配失败后&#xff0c;回退的位置。 给定一个字符串 S&#xff0c;以及一个模式串 P&#xff0c;所有字符串中只包含大小写英文字…

大文件上传如何做断点续传

大文件上传如何做断点续传 一、是什么 不管怎样简单的需求&#xff0c;在量级达到一定层次时&#xff0c;都会变得异常复杂 文件上传简单&#xff0c;文件变大就复杂 上传大文件时&#xff0c;以下几个变量会影响我们的用户体验 服务器处理数据的能力请求超时网络波动 上…

信息安全3——数字签名和认证

1 &#xff09;签名&#xff1a;手写签名是被签文件的物理组成部分&#xff0c;而数字签名不是被签消息的物理部分&#xff0c;因而需要将签名连接到被签消息上。 2 &#xff09;验证&#xff1a;手写签名是通过将它与其它真实的签名进行比较来验证而数字签名是利用已经公开的验…

年终总结(我心飞翔向)

2022 年度个人总结&#xff08;自由向&#xff09; 前奏 其实在2021年12月底考研前就回家了&#xff0c;回家做毕设。他们考研的那几天回了中北&#xff0c;参加了党支部会议&#xff0c;见证了一批同学的转预转正&#xff1b;收拾了一大波衣服&#xff0c;因为我已经提前想到…

Git(三) - Git 常用命令

一、设置用户签名 说明&#xff1a; 签名的作用是区分不团操作者身份。用户的签名信息在每一个版本的提交信息中能够看到&#xff0c;以此确认本次提交是谁做的。GIT 首次安装必须设置一下用户签名&#xff0c;否则无法提交代码。 注意&#xff1a; 这里设置用户前面和将来登录…

微机原理真题2019年,错题整理

目录 2019年 填空 编程 1​编辑 2 3 练习册的题 2019年 1&#xff1a;在计算机中能够在一组信息中取出所需要的一部分信息的器件是&#xff08;&#xff09; A:触发器 B:寄存器 C:译码器 D:锁存器 2&#xff1a;宏汇编程序中一般由3个段组成&#xff0c;这三…

FreeRTOS实验使用01

1&#xff1a;vTaskList的使用 我使用的时候&#xff0c;如果把pcWriteBuff定义在任务中&#xff0c;程序会卡死&#xff0c;不信你可以尝试一下&#xff0c;所以我就把pcWriteBuff定义到了全局中&#xff0c;才能使用 2&#xff1a;队列问题 场景&#xff1a;创建3个格子的队…