RGB 颜色空间转 HSI 颜色空间的matlab程序实现
RGB 颜色空间转 HSI 颜色空间的matlab程序实现
2014.10.20之前的内容有误,这里依据wikipedia更新了算法内容. 算法以wiki为准
https://en.wikipedia.org/wiki/HSL_and_HSV
这里demo出 HSI中 S 空间的图像和暗通道图的对照.
会发现,确实右边到非常暗,这是由于HSV转换的时候对RGB值做了归一化处理,假设打印出归一化处理后的R+G+B值会发现输出图像非常亮(白茫茫一片~)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2lubXloZWFydA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
下图是取自图像第321列的数据分布,能够看见图像的灰度分布是非常明晰的
以下给出了我写的转换函数,直接调用就可以.
%%**************************************************************************
% Function writer : EOF
% code file : RGB2SHI_Color.m
% code date : 2014.10.16
% Translate RGB into HSI-space
%
% Code Description:
%
% If you want to translate a colourful Image which is coded as
% RGB colour space into HSI space, what you need to do is just input your
% colour image.
%
% This function would return HSI as a matrix [H,S,I].
%
%% *************************************************************************
function [H,S,I] = RGB2SHI_Color(Image) if size(Image,3) ~= 3
fprintf('ERROR Imput-Image must be three channel image\n');
return;
end Height_Image = size(Image,1);
Width_Image = size(Image,2);
Channel_Image = size(Image,3); H = zeros(1,Height_Image * Width_Image);
H_temp = zeros(1,Height_Image * Width_Image);
S = zeros(1,Height_Image * Width_Image);
I = zeros(1,Height_Image * Width_Image);
%% Normalization into (0,1)
R_temp = double(Image(:,:,1));
G_temp = double(Image(:,:,2));
B_temp = double(Image(:,:,3)); R = R_temp./(R_temp + G_temp + B_temp);
G = G_temp./(R_temp + G_temp + B_temp);
B = B_temp./(R_temp + G_temp + B_temp); Max_channel = max(max(R,G),B);
Min_channel = min(min(R,G),B);
Difference = Max_channel - Min_channel; I = (R + G + B)./3; for row = 1:Height_Image
for col = 1: Width_Image % In fact , if Difference(row,col) is zero, the H_temp is
% undefine , it means that H_temp(row,col) close to
% infinite.
if Difference(row,col) == 0
H_temp(row,col) = 0;
end if Max_channel(row,col) == R(row,col)
H_temp(row,col) = mod((G(row,col) - B(row,col)) ...
./Difference(row,col), 6 );
end if Max_channel(row,col) == G(row,col)
H_temp(row,col) = (B(row,col) - R(row,col)) ...
./Difference(row,col) + 2;
end if Max_channel(row,col) == B(row,col)
H_temp(row,col) = (B(row,col) - R(row,col)) ...
./Difference(row,col) + 4;
end H(row,col) = H_temp(row,col)*60; if I(row,col) == 0
S(row,col) = 0;
else
S(row,col) = 1 - (Min_channel(row,col)./I(row,col));
end
end
end end
RGB 颜色空间转 HSI 颜色空间的matlab程序实现的更多相关文章
- RGB颜色空间、HSV颜色空间的理解
HSV是把H(色相),S(饱和度),V(亮度)当做色值来定位颜色的空间. 1.HSV模型 色相:取值范围是0~360度,用来表示颜色的类别.其中红色是0度,绿色是120度,蓝色是240度.饱和度:取值 ...
- [zz]求一维序列的信息熵(香浓熵)的matlab程序实例
对于一个二维信号,比如灰度图像,灰度值的范围是0-255,因此只要根据像素灰度值(0-255)出现的概率,就可以计算出信息熵. 但是,对于一个一维信号,比如说心电信号,数据值的范围并不是确定的, ...
- 条件随机场matlab程序下载
19:44:23 1 http://www.cs.ubc.ca/~murphyk/Software/CRF/crf.html matlab程序包: 该条件随机场程序(CRF)是针对语句进行标注,mat ...
- 【matlab】MATLAB程序调试方法和过程
3.8 MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...
- C/C++程序通过动态链接库调用MATLAB程序
C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...
- 非均匀B样条拟合MATLAB程序
直接上代码,多的不再说了. %------------------非均匀B样条拟合MATLAB程序----------------- clear k=; x=load('data.txt'); [n, ...
- 蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...
- 现代控制理论习题解答与Matlab程序示例
现代控制理论习题解答与Matlab程序示例 现代控制理论 第三版 课后习题参考解答: http://download.csdn.net/detail/zhangrelay/9544934 下面给出部分 ...
- MATLAB程序:用FCM分割脑图像
MATLAB程序:用FCM分割脑图像 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 脑图像基础知识请看:脑图像:FCM算法介绍请看:聚类——FCM:数据 ...
随机推荐
- Centos7不修改默认交换分区下添加交换分区
交换分区介绍 Linux系统中的交换分区是当物理内存(RAM)被充满时,作为物理内存的缓存来使用. 当系统需要更多的内存资源而物理内存已经充满,内存中不活跃的页就会被移动到交换分区上. 交换分区位于硬 ...
- caioj 1077 动态规划入门(非常规DP1:筷子)
首先可以看出排序之后,最优解肯定是每一对都相邻才是最优的 那么我们就要找构成最优解的相邻组 设f[i][j]是前i个字符,k对的最小值 如果当前这个筷子不取的话,f[i][j] = f[i-1][j] ...
- 【VK Cup 2015 - Finals D】Restructuring Company
[题目链接]:http://codeforces.com/problemset/problem/566/D [题意] 给你n个人; 一开始每个人都隶属于一个部门; 之后给你q个操作; 3种操作类型; ...
- hdu(1069)——Monkey and Banana(LIS变形)
题意: 如今给你n个石块,然后它由坐标来表示(x,y,z).可是它能够有不同的方法,也就是说它的三个坐标能够轮换着来的. 石块的数量不限,可是每次都必须保持上底面的长和宽严格递减,然后问你用这些石块所 ...
- Azure 配置高可用的准备系列工作-建立不同区域的存储账户和建立网络!
我们谈到我们的业务,常常谈到一个词.三层架构,就是我们的UI层.数据訪问层和数据存储层的分离,通常情况下我们的业务高可用必须满足这三层的所有高可用的情况下才干达到最高级别的高可用. 那么谈到Az ...
- ddr sdram self-refresh & auto-refresh
以下是EDD5116AFTA数据手册的摘录.不过看过了还是不太明白二者的区别. self-refresh:Self-refresh entry [SELF]This command starts se ...
- BZOJ 3196 线段树套平衡树
(代码无比丑陋) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int ...
- POJ2823 单调队列
POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...
- HDU 4372 Count the Buildings
Count the Buildings Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- javascript——对象
分类 JavaScript对象分类: 内置对象:由ECMAScript规范定义的对象或类,例如:数组.函数.日期(Date()).正则表达式 宿主对象:是由js解释器所嵌入的宿主环境(比如Web浏览器 ...