matlab将RGB图像在HSI空间去噪

news2024/11/25 20:39:15

思路与代码

RGB 转换为 HSI 的计算步骤如下:

首先归一化三通道值 :

r = R R + G + B r = \frac{R}{R+G+B} r=R+G+BR
g = G R + G + B g = \frac{G}{R+G+B} g=R+G+BG
b = B R + G + B b = \frac{B}{R+G+B} b=R+G+BB

接下来,计算 HSI 图像的亮度 I I I

I = R + G + B 3 I = \frac{R+G+B}{3} I=3R+G+B

然后,计算饱和度 S S S

S = 1 − 3 R + G + B ⋅ min ⁡ ( R , G , B ) S = 1 - \frac{3}{R+G+B} \cdot \min(R,G,B) S=1R+G+B3min(R,G,B)

最后,计算色相 H H H

H = { θ if  B ≤ G 2 π − θ if  B > G H = \begin{cases} \theta & \text{if } B \leq G \\ 2\pi - \theta & \text{if } B > G \end{cases} H={θ2πθif BGif B>G

其中 θ \theta θ为:

θ = arccos ⁡ ( 1 2 [ ( R − G ) + ( R − B ) ] ( R − G ) 2 + ( R − B ) ( G − B ) ) \theta = \arccos (\frac{\frac{1}{2}[(R-G)+(R-B)]}{\sqrt{(R-G)^2+(R-B)(G-B)}}) θ=arccos((RG)2+(RB)(GB) 21[(RG)+(RB)])

如果把 θ \theta θ带入 H H H的式子中则是如下形式

H = { cos ⁡ − 1 ( 1 2 [ ( R − G ) + ( R − B ) ] ( R − G ) 2 + ( R − B ) ( G − B ) ) if  B ≤ G 2 π − cos ⁡ − 1 ( 1 2 [ ( R − G ) + ( R − B ) ] ( R − G ) 2 + ( R − B ) ( G − B ) ) if  B > G H = \begin{cases} \cos^{-1}\left(\frac{\frac{1}{2}[(R-G)+(R-B)]}{\sqrt{(R-G)^2+(R-B)(G-B)}}\right) & \text{if } B \leq G \\ 2\pi - \cos^{-1}\left(\frac{\frac{1}{2}[(R-G)+(R-B)]}{\sqrt{(R-G)^2+(R-B)(G-B)}}\right) & \text{if } B > G \end{cases} H= cos1((RG)2+(RB)(GB) 21[(RG)+(RB)])2πcos1((RG)2+(RB)(GB) 21[(RG)+(RB)])if BGif B>G

注:色相值 H H H 是以弧度制表示的

相关的matlab代码大概是这样的

im = imread('1.jpg'); %读入原图
image = imnoise(im,'salt & pepper',0.02);
% 归一化RGB值
normalized_image = double(image) / 255;

% 提取RGB通道
R = normalized_image(:, :, 1);
G = normalized_image(:, :, 2);
B = normalized_image(:, :, 3);

% 计算亮度(Intensity)
I = (R + G + B) / 3;

% 计算饱和度(Saturation)
S = 1 - min(min(R, G), B) ./ I;

% 计算色调(Hue)
H = acos((0.5 * ((R - G) + (R - B))) ./ sqrt((R - G).^2 + (R - B) .* (G - B)));
H(B > G) = 2 * pi - H(B > G);
H = H / (2 * pi);

% 合并HSI通道
hsi_image = cat(3, H, S, I);

但是确实很麻烦,因此可以去matlab官网下载一些有这个功能的工具包(或者说叫做代码集),我下的是下图这个,但是不代表别的不能用(去官网下载要注册账号的):

在这里插入图片描述

这是使用了转换函数的简化代码:

clear;
I = imread('3.png'); %读入原图
im = imnoise(I,'salt & pepper',0.01);
hsi_image = rgb2hsi(im);
% 显示原始图像
subplot(2, 2, 1);
imshow(im);
title('原始图像');

% 显示转换后的HSI图像
subplot(2, 2, 2);
imshow(hsi_image);
title('HSI图像');

% 使用平均值滤波器,此处是3*3邻域的
filter = ones(3,3)/9;
h = imfilter(hsi_image, filter);
subplot(2, 2, 3);
imshow(h);
title('HSI降噪完的HSI图像');

hh = hsi2rgb(h);
subplot(2, 2, 4);
imshow(hh);
title('HSI降噪后的RGB图像');

在这里插入图片描述
放一下降噪前后的大图对比一下:

在这里插入图片描述
在这里插入图片描述

HSI转RGB

随后将HSV转换为RGB图像,依旧是依据公式,计算公式如下

R = { I ( 1 − S ) if  h < 2 π 3 I [ 1 + S cos ⁡ ( h − 2 π 3 ) ÷ cos ⁡ ( π 3 − h ) ] if  2 π 3 ≤ h < 4 π 3 I ( 1 − S ) if  h ≥ 4 π 3 R = \begin{cases} I(1-S) & \text{if } h < \frac{2\pi}{3} \\ I\left[1+S\cos\left(h - \frac{2\pi}{3}\right) \div \cos\left(\frac{\pi}{3}-h\right)\right] & \text{if } \frac{2\pi}{3} \leq h < \frac{4\pi}{3} \\ I(1-S) & \text{if } h \geq \frac{4\pi}{3} \end{cases} R= I(1S)I[1+Scos(h32π)÷cos(3πh)]I(1S)if h<32πif 32πh<34πif h34π

G = { I [ 1 + S cos ⁡ ( h ) ÷ cos ⁡ ( π 3 − h ) ] if  h < 2 π 3 I ( 1 − S ) if  2 π 3 ≤ h < 4 π 3 I [ 1 + S cos ⁡ ( h − 4 π 3 ) ÷ cos ⁡ ( π 3 − h ) ] if  h ≥ 4 π 3 G = \begin{cases} I\left[1+S\cos\left(h\right) \div \cos\left(\frac{\pi}{3}-h\right)\right] & \text{if } h < \frac{2\pi}{3} \\ I(1-S) & \text{if } \frac{2\pi}{3} \leq h < \frac{4\pi}{3} \\ I\left[1+S\cos\left(h - \frac{4\pi}{3}\right) \div \cos\left(\frac{\pi}{3}-h\right)\right] & \text{if } h \geq \frac{4\pi}{3} \end{cases} G= I[1+Scos(h)÷cos(3πh)]I(1S)I[1+Scos(h34π)÷cos(3πh)]if h<32πif 32πh<34πif h34π

B = { I [ 1 + S cos ⁡ ( h + 2 π 3 ) ÷ cos ⁡ ( π 3 − h ) ] if  h < 2 π 3 I [ 1 + S cos ⁡ ( h − 2 π 3 ) ÷ cos ⁡ ( π 3 − h ) ] if  2 π 3 ≤ h < 4 π 3 I ( 1 − S ) if  h ≥ 4 π 3 B = \begin{cases} I\left[1+S\cos\left(h + \frac{2\pi}{3}\right) \div \cos\left(\frac{\pi}{3}-h\right)\right] & \text{if } h < \frac{2\pi}{3} \\ I\left[1+S\cos\left(h - \frac{2\pi}{3}\right) \div \cos\left(\frac{\pi}{3}-h\right)\right] & \text{if } \frac{2\pi}{3} \leq h < \frac{4\pi}{3} \\ I(1-S) & \text{if } h \geq \frac{4\pi}{3} \end{cases} B= I[1+Scos(h+32π)÷cos(3πh)]I[1+Scos(h32π)÷cos(3πh)]I(1S)if h<32πif 32πh<34πif h34π

其中, H H H S S S I I I 分别表示 HSI 图像的色相(色调)、饱和度和亮度

在计算 RGB 像素值之前,需要将 HSI 中的色相值转换为弧度制。

相关matlab代码放在下方,因为是自己写的,可能会因疏忽有错,不如直接用上面下载的工具集代码

% 读入HSI图像(是上面代码保存的)
hsi_image = imread('HSI降噪图.jpg');

% 将HSI图像转换为double类型
hsi_image = im2double(hsi_image);

% 分离出HSI图像的各个通道
hue_channel = hsi_image(:,:,1) * 2 * pi;
saturation_channel = hsi_image(:,:,2);
intensity_channel = hsi_image(:,:,3);

% 将HSI通道转换为RGB通道
red_channel = zeros(size(hue_channel));
green_channel = zeros(size(hue_channel));
blue_channel = zeros(size(hue_channel));

% 计算RGB通道的值
for i = 1:size(hue_channel, 1)
    for j = 1:size(hue_channel, 2)
        if hue_channel(i,j) >= 0 && hue_channel(i,j) < 2/3*pi
            blue_channel(i,j) = intensity_channel(i,j) * (1 - saturation_channel(i,j));
            red_channel(i,j) = intensity_channel(i,j) * (1 + (saturation_channel(i,j) * cos(hue_channel(i,j))) / cos(pi/3 - hue_channel(i,j)));
            green_channel(i,j) = 3 * intensity_channel(i,j) - (red_channel(i,j) + blue_channel(i,j));
        elseif hue_channel(i,j) >= 2/3*pi && hue_channel(i,j) < 4/3*pi
            hue_channel(i,j) = hue_channel(i,j) - 2/3*pi;
            red_channel(i,j) = intensity_channel(i,j) * (1 - saturation_channel(i,j));
            green_channel(i,j) = intensity_channel(i,j) * (1 + (saturation_channel(i,j) * cos(hue_channel(i,j))) / cos(pi/3 - hue_channel(i,j)));
            blue_channel(i,j) = 3 * intensity_channel(i,j) - (red_channel(i,j) + green_channel(i,j));
        else
            hue_channel(i,j) = hue_channel(i,j) - 4/3*pi;
            green_channel(i,j) = intensity_channel(i,j) * (1 - saturation_channel(i,j));
            blue_channel(i,j) = intensity_channel(i,j) * (1 + (saturation_channel(i,j) * cos(hue_channel(i,j))) / cos(pi/3 - hue_channel(i,j)));
            red_channel(i,j) = 3 * intensity_channel(i,j) - (green_channel(i,j) + blue_channel(i,j));
        end
    end
end

% 将RGB通道合成为RGB图像
rgb_image = cat(3, red_channel, green_channel, blue_channel);

% 显示RGB图像
imshow(rgb_image);
imwrite(rgb_image,'降噪后的RGB图.jpg','jpg');

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

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

相关文章

(转载)从0开始学matlab(第3天)—子数组

你可以选择和使用一个 MATLAB 函数的子集&#xff0c;好像他们是独立的数组一样。在数组名后面加括号&#xff0c;括号里面是所有要选择的元素的下标&#xff0c;这样就能选择这个函数的子集了。例如&#xff0c;假设定义了一个数组 arr1 如下 arr1[1.1 -2.2 3.3 -4.4 5.5] 那…

yolov5 实例分割 jason标注格式转换 训练自己的数据集

目录 一、coco128-seg数据集分析 1、配置文件 coco128-seg.yaml 2、coco128-seg数据集 二、自己用anylabeling标注获得的json文件 三、json文件转coco128-seg格式 四、实例分割训练 1、修改数据配置文件 coco128-seg.yaml 2、训练 一、coco128-seg数据集分析 这个博客中有…

5。STM32裸机开发(3)

嵌入式软件开发学习过程记录&#xff0c;本部分结合本人的学习经验撰写&#xff0c;系统描述各类基础例程的程序撰写逻辑。构建裸机开发的思维&#xff0c;为RTOS做铺垫&#xff08;本部分基于库函数版实现&#xff09;&#xff0c;如有不足之处&#xff0c;敬请批评指正。 &…

【探索SpringCloud】服务发现

前言 今天&#xff0c;我们来聊聊SpringCloud服务发现。主要有如下几个议题&#xff1a; 一、服务发现的概念与方案&#xff1b;二、SpringCloud是如何与各个服务注册厂商进行集成的。 服务发现 在微服务架构中&#xff0c;我们不可避免的需要通过服务间的调用来完成系统功能…

Fourier分析入门——第1章——数学预备知识

第 1 章 学习Fourier分析的数学预备知识 目录 第 1 章 学习Fourier分析的数学预备知识 1.1 引言 1.2 几何和代数的一些相关概念的回顾 1.2.1 标量运算(scalar arithmetic) 1.2.2 向量运算(vector arithmetic) 1.2.3 向量乘法(vector multiplication) 1.2.4 向量长度 …

设计模式(java)-观察者模式

1. 简介 观察者模式&#xff0c;行为型设计模式。观察者模式在实际项目实践中&#xff0c;是一种使用较频繁的设计模式&#xff0c;它主要解决的是信息同步的问题&#xff0c;当多个对象需要从同一个主题中得到自身所需要的信息或状态&#xff0c;并通过这些信息或状态做出相应…

以太网外设ETH

1. 概述 近几年&#xff0c;项目需要&#xff0c;在多款单片机上使用了以太网外设。 本文为阶段知识整理&#xff0c;查缺补漏&#xff0c;方便以后再次遇到相关任务时&#xff0c;可以游刃有余的完成工作。 1.1 修改时间 2023年5月6日创建本文。包含STM32的ETH外设。2023年…

利用CNN对车牌进行智能识别(python代码,解压缩后直接运行)

1.代码流程 该段代码主要利用卷积神经网络&#xff08;CNN&#xff09;来识别车牌。下面是代码的主要流程&#xff1a; 导入所需的库和模块&#xff0c;包括matplotlib、numpy、cv2、tensorflow等。 加载用于检测车牌的级联分类器&#xff08;cascade classifier&#xff09;…

可见光遥感目标检测(一)任务概要介绍

前言 本篇开始对遥感图像的目标检测进行介绍&#xff0c;介绍了其目标前景、数据集以及评价指标。 本教程禁止转载。同时&#xff0c;本教程来自知识星球【CV技术指南】更多技术教程&#xff0c;可加入星球学习。 Transformer、目标检测、语义分割交流群 欢迎关注公众号CV技…

机器学习13(正则化)

文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容&#xff0c;并就 sklearn 中逻辑回归&#xff08;评估器&#xff09;的参数进行详细解释由于 skle…

javaweb项目实战之myBlog

项目简介 技术栈&#xff1a; Java Mysql Html Ajax Css JS Json 项目说明 &#xff1a;项目使用maven创建&#xff0c;使用MVC架构模式 表示层&#xff1a;通俗讲就是展现给用户的界面和控制器层Servlet&#xff0c;接受请求、封装数据、调用业务 逻辑层&#xff0c;响…

libevent高并发网络编程 - 05_libevent实现http客户端

文章目录 1 http客户端相关的APIevhttp_uri_parse()evhttp_uri_get_scheme()evhttp_uri_get_port()evhttp_uri_get_host()evhttp_uri_get_path()evhttp_uri_get_query()evhttp_connection_base_bufferevent_new()evhttp_request_new()evhttp_make_request()evhttp_request_get_…

刷题刷题,开心

一先来每日一题 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案&#xff0c;此题保证存在答案。 示例 1&#xff1a; 输入&…

基于html+css图展示59

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Prompt learning 教学[最终篇]:Chatgpt使用场景推荐、优秀学习资料推荐、AI工具推荐

Prompt learning 教学[最终篇]&#xff1a;Chatgpt使用场景推荐、优秀学习资料推荐、AI工具推荐 1.chatgpt使用场景推荐 各位应该在各种平台看到不少可以尝试使用的场景&#xff0c;我这里仅收录&#xff1a; 有意思的场景&#xff1a;一般比较垂直或者小众&#xff0c;或者出…

CobaltStrike项目实战

环境介绍 模拟内网有三台机器&#xff1a;WEB、PC和DC。 WEB服务器有两个网络适配器&#xff0c;适配器1处于NAT模式用于连接外网&#xff0c;适配器2用于内网。 PC和WEB服务器一样&#xff0c;有两个适配器&#xff0c;能够同时访问外网和内网&#xff1b;DC作为域控制器&…

神经网络的训练过程、常见的训练算法、如何避免过拟合

神经网络的训练是深度学习中的核心问题之一。神经网络的训练过程是指通过输入训练数据&#xff0c;不断调整神经网络的参数&#xff0c;使其输出结果更加接近于实际值的过程。本文将介绍神经网络的训练过程、常见的训练算法以及如何避免过拟合等问题。 神经网络的训练过程 神…

henan Problem E. 矩阵游戏

hunan Problem E. 矩阵游戏 Attachments - 2023 CCPC Henan Provincial Collegiate Programming Contest - Codeforces 思路&#xff1a; 我们考虑用dp,定义f[i][j][k],代表从1,1走到i,j并且使用k次变换操作能够获得的最大 价值&#xff0c;那么类似于01背包&#xff0c;接下…

分布式数据库集成解决方案2

分布式数据库集成解决方案2 扩展阅读内部结构1.表空间&#xff08;TABLESPACE&#xff09; # 摘要 : 本文讨论了某公司发货系统的分布式数据库集成解决方案。该公司由于业务的发展&#xff0c;要在另三个城市设立货仓进行发货。为此&#xff0c;需要增加原先的MIS系统实现这一功…

javaweb系列-js函数、数组、字符串

1.4 函数 JavaScript中的函数被设计为执行特定任务的代码块&#xff0c;通过关键字function来定义。JavaScript中定义函数有2种语法。 第一种方法&#xff1a; <script>//定义function add(a,b){return a b;}//调用var a add(1,2);alert(a); </script> 第二种方…