本篇博客借鉴了:https://blog.csdn.net/qq_35608277/article/details/78363139
但是他的代码还有一些地方没有说明清楚,并且使用之后效果不是很好。所以我在他的基础上再整理了一下

关于去除红眼的模型我这里使用的是HSI模型,HSI转RGBRGB转HSI的公式大家应该都知晓了,我这里就直接放图了。


我们确定好ROI区域后,就根据以下公式来消除红眼:


下面直接上代码

RGB转HSI代码
function [hsi,H,S,I]=rgb2hsi(rgb)
% 因为获得的是RGB图像,输出的hsi要是double的[0,1]
% RGB转换到HSI
rgb=im2double(rgb);
r=rgb(:,:,1); %因为RGB是3维彩色图像,所以这里分别提取这3维向量
g=rgb(:,:,2);
b=rgb(:,:,3);
% 下面定义转换公式
fm = 0.5 * ((r-g)+(r-b));
fz = sqrt((r-g).^2 + (r-b).*(g-b));
theta = acos(fm./(fz+eps));
H = theta;
H(g<b) = 2*pi-H(g<b);
H = H/(2*pi); %因为matlab处理颜色范围只能在0-1fm2 = min(min(r,g),b);
fz2 = r+g+b;
fz2(fz2==0) = eps;
S = 1-3.*fm2./fz2;
H(S==0) = 0;
I = (r+g+b)/3;
hsi = cat(3,H,S,I);
HSI转RGB代码
function rgb=hsi2rgb(hsi)
% HSI转换到RGB
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);%Implement the conversion equations.
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));% RG sector (0<=H<2*pi/3).
idx=find((0<=H)&(H<2*pi/3));
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));
%BG sector (2*pi/3<=H<4*pi/3).
idx=find((2*pi/3<=H)&(H<4*pi/3));
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));
%BR sector.
idx=find((4*pi/3<=H)&(H<=2*pi));
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);
主函数
clear;clc;
% 图片读取
[FileName,PathName] = uigetfile('这里写自己的图片路径\*.jfif','请选择一幅jpg图像');
[picture_in,map]=imread(FileName);%imread函数实现图像导入
% 彩色判断
if ndims(picture_in)~=3 % ndims函数判断矩阵维度disp('非彩色图像');imshow(picture_in); %显示灰度图像
else %去红眼操作h1=1/8; %预设对rol区域内-pi/4<H<pi/4,S>0.2的像素点进行去红眼操作h2=1/8; %H色调,S色饱和度s=0.2; %色调范围0–1fprintf('预设对rol区域内-pi/4<H<pi/4,S>0.2的像素点进行去红眼操作,即令S=0\n')
end
% 区域选定
%先画左眼,再画右眼
fprintf('请绘制左眼区域\n') %绘制去红眼的rol区域,返回大小相同的逻辑矩阵B
Left_eye=roipoly(picture_in); %右键绘制最后一个点,绘制完成后创建图层标记
fprintf('请绘制右眼区域\n')
Right_eye=roipoly(picture_in);
% 红眼处理
[hsi_1,H,S,I]=rgb2hsi(picture_in); %rgb2hsi函数实现rgb转hsi
rol=find((Left_eye~=0)|(Right_eye~=0)); %获取rol像素索引
[L,M]=size(rol); %获取rol的矩阵大小
for i=1:L %遍历rol内像素,-1/8<h<1/8且s>0.2为红眼,令s=0去除红眼%因为H本来就是>0的,所以<0的部分就是两边同时+1就行 所以用 “if(H(rol(i))>(-h1) && H(rol(i))<h2)%” 不对if (((H(rol(i))>0)&&(H(rol(i))<h2))||((H(rol(i))>(1-h1))&&(H(rol(i))<1)))if S(rol(i))>sS(rol(i))=0; %令色饱和度为0endend
end
hsi_2=cat(3,H,S,I); % 生成去红眼后的hsi图像
rgb=hsi2rgb(hsi_2); % hsi->rgb
%% 对比输出
figure
subplot(1,2,1)
imshow(picture_in)
title('原RGB图像')
subplot(1,2,2)
imshow(rgb)
title('去红眼RGB图像')

效果展示如下

matlab去除红眼代码及详细介绍相关推荐

  1. html中超链接使用_html中的a标签,超链接代码的详细介绍

    欢迎关注支持,谢谢!今天为大家介绍的是超链接代码a标签的用法,大家有兴趣的话可以看看哟! 随着互联网的发展,网站的兴起,超链接随处可见.我们使用电脑或手机上网,能够穿梭在各个网页之间,都是通过超链接实 ...

  2. python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码

    用html画出来确实是第一次接触,所以很乐意去尝试一下,对于我这种菜鸟,确实是帮助不少,至少懂得如何去画一个简单的人物形象出来,再加上一些动画效果,就活了,那就更好玩了!OK,开始之前,先把效果图晒一 ...

  3. 水准网平差程序Matlab实现 全部代码,详细教程

    一.程序结构: 输入文件格式如下所示: 1 读取文件:主要用到fopen, str2num函数 fid = fopen('input_leveling.txt','r'); line1 = fgetl ...

  4. 详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建

       本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示.本文作为本系列的第一篇文章主要介绍如何进行环境的创建,还有一定要记得读前言!!! 本系列文章链接: ------- ...

  5. matlab您的安装可能需要执行其他配置步骤_手把手超详细介绍MATLAB+RoadRunner+Unreal Engine自动驾驶联合仿真...

    RoadRuner是MathWorks新收购的自动驾驶场景构建工具,Unreal Engine是商业游戏引擎.RoadRunner创建驾驶场景,导入到Unreal Engine,与Simulink联合 ...

  6. matlab和ansys联合优化,MATLAB与HFSS联合建模与仿真优化详细介绍

    [实例简介] 本文详细介绍了MATLAB与HFSS的联合优化方法,并介绍了基于粒子群算法的阻抗调制表面天线的副瓣优化流程 1. Tools→ Record script to file,保持类型选择( ...

  7. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】

    提示:下文将介绍2022年华为杯数学建模E题赛后总结加思路详细介绍配代码 傻逼队友,傻逼队友,傻逼队友一定要看好人在进行组队,这是劝告. 这里有几点总结进行描述: 第一,图一定要尽量多,对图的解释要多 ...

  8. 很好的学习资料-详细介绍SVM-来自matlab论坛-【关于SVM的那点破事】.mht

    上网查阅资料,在matlab论坛发现了一个好长好长的好帖子,推荐给想要踏踏实实研究svm的初学者. 帖子优点: 1,详细.例如:matlab mex的设置问题,详细介绍了 mex -setup 各个选 ...

  9. php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)

    本篇文章给大家带来的内容是关于MySQL自增字段取值的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表 ...

最新文章

  1. Java学习总结:20
  2. 写一篇C语言入门第一讲
  3. 崛起的Python,真的影响了76万人?
  4. LeetCode-链表-206. 反转链表
  5. linux系统一下剪贴板在哪里,Linux的最佳剪贴板管理器
  6. java blender_[转载]将Blender模型展示于WEB
  7. FFT C语言 修改了matlab
  8. 优先队列的数组实现(有序)
  9. HDOJ 1012-1020
  10. jeecms 代码生成 Tools
  11. java debugger
  12. 你以为只有菜鸟求职碰壁,其实还有...
  13. Java开发童年小游戏
  14. css3实现建筑物的旋转,CSS3实现旋转光环效果的实现步骤
  15. 2021-2027全球与中国自动卡车卸货系统 (ATLS)市场现状及未来发展趋势
  16. 画一只会动的皮卡丘(上)
  17. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...
  18. 金融风控-贷款违约预测项目记录
  19. 转:成功的数字化领导者,身兼四职
  20. 使用CNVkit进行CNV分析

热门文章

  1. 瑞吉外卖——菜品展示功能(移动端)
  2. Oracle SQL Developer使用dbms_output.put_line显示输出
  3. 类图、用例图、时序图、状态图、活动图、流程图、顺序图(转)
  4. flutter packages get 慢 解决方案
  5. 导出RK3288开发板上的根文件系统,并打包img
  6. 小红书最新的内容趋势是什么?
  7. matlab将图片旋转的代码_基于Matlab的PMSM模型初探
  8. async await 处理异步变同步(微信小程序内举例)
  9. 米的换算单位和公式_数学单位换算公式,1-6年级计算必备!
  10. 餐饮连锁门店重塑增长背后的数字化转型