MATLAB图像处理实现高光抑制

news2024/12/23 19:03:15

下面是的几个用MATLAB进行高光抑制的处理例子。

1. 基于最大值滤波的亮光抑制方法

原理是用某像素周围一定大小的邻域中的最大值减去该像素值,可达到亮光抑制的效果。在MATLAB中,可以使用mat2gray函数将图像归一化后,再使用imextendedmax函数进行最大值滤波,函数调用方式为:

ori = imread('ImageProcess/input/local.png');
sigma = 0.4;
alpha = 0.2;
beta = 0.5;

% imshow(ori)
fig = figure;   % 返回句柄来进行图像保存
title('Traffic Light Diff');

% 同时显示出多中滤波对交通灯的处理方法,并在同一个数据面板上显示
subplot(3, 1, 1);       
aug = locallapfilt(ori, sigma, alpha, beta);
imshowpair(ori, aug, 'montage');

subplot(3, 1, 2);
thresh = 0.4;
aug_I = imextendedmax(mat2gray(ori), thresh);
imshowpair(ori, aug_I, 'montage');

subplot(3, 1, 3);
% aug_I2 = imcomplement(imextendedmax(mat2gray(aug), 0.5));  % 取反操作
aug_I = imextendedmax(mat2gray(ori), thresh);  % 获取高光部分区域
J = aug;
avg_val = mean(J(~aug_I));    % 将高光部分区域外的像素求平均值
J(aug_I) = avg_val;
imshowpair(ori, J, 'montage');

% 文件保存
save_path = strcat('ImageProcess/output/', 'figure', '.jpg');
saveas(fig, save_path);

其中,I为输入图像,thresh为一个介于0和1之间的阈值。

  • 测试效果
    在这里插入图片描述

2. 高亮区域gamma滤波

  • 利用多个局部掩码辅助gamma滤波实现级层处理
ori = imread("input\local.png");
sigma = 0.4;
alpha = 0.2;
beta = 0.5;

Nsub = 5;
% imshow(ori)
fig = figure;   % 返回句柄来进行图像保存
title('Traffic Light Diff');

% 1) 获取全局local laplacian filter处理图像
subplot(Nsub, 1, 1);       
aug = locallapfilt(ori, sigma, alpha, beta);    
imshowpair(ori, aug, 'montage');
 
% 2) 检测出高光区域
subplot(Nsub, 1, 2);
thresh = 0.70;   % 数值越大区域越大
augI = imextendedmax(mat2gray(ori), thresh);    % 高光区域

threshM = 0.6;
augM = imextendedmax(mat2gray(ori), threshM);

threshS = 0.4;
augS = imextendedmax(mat2gray(ori), threshS);
imshowpair(augI, augM, 'montage');

% 取反
% subplot(4, 1, 3);
% augI_inverse = imcomplement(augI);
% imshowpair(ori, augI_inverse, 'montage');

% 在拉普拉斯图像中获取高光区域部分
local = aug(augI);    
localM = aug(augM);
localS = aug(augS);

% 对高光区域进行处理
local = imgaussfilt(local);      % 2d高斯滤波

% 设置亮度降低的参数
% gamma = 1.6;
% low_in = 0;         % 输入图像中的最低亮度值
% high_in = 80;      % 输入图像中的最高亮度值
% low_out = 0;        % 输出图像中的最低亮度值
% high_out = 10;     % 输出图像中的最高亮度值
% local_gamma = imadjust( ...
%     local_gaussf, ...
%     [low_in/high_in, high_in/high_in], ...
%     [low_out/high_out, high_out/high_out], ...
%     gamma ...
% );   % gamma值越大越暗
gamma = 1.6;
local_gamma = imadjust(local, [], [], gamma);

gammaM = 2.4;
localM_gamma = imadjust(localM, [], [], gammaM);

gammaS = 3.2;
localS_gamma = imadjust(localS, [], [], gammaS);

subplot(Nsub, 1, 3);
J = aug;
J(augI) = local_gamma;       % 对高光区域进行填充
J(augM) = localM_gamma;
J(augS) = localS_gamma;
imshowpair(augS, J, 'montage');


% 最后的效果对比
subplot(Nsub, 1, 4);
w = 0.8;
out = (1-w)*aug + w*J;
imshowpair(ori, out, 'montage');

subplot(Nsub, 1, 5);
imshowpair(aug, out, 'montage');
  • 局部效果展示
    在这里插入图片描述

将上面的主体函数构造成一个函数的形式,并保存到本地,这里涉及到了matlab字符串的使用。

img_path = 'input\car01.jpeg';

img_aug = local_highlight_restrain(img_path);
img = imread(img_path);

figure;
subplot(1,1,1);
imshowpair(img, img_aug, 'montage');

out_path = strrep(img_path, 'input', 'output');
imwrite(img_aug, out_path);

3. 进行取反后拉普拉斯处理

clear
clc
close all
ori = imread("input\local.png");

Nsub = 4;
% imshow(ori)
fig = figure;   % 返回句柄来进行图像保存


% 1) 获取全局local laplacian filter处理图像
subplot(Nsub, 1, 1);       
sigma = 0.4;
alpha = 0.2;
beta = 0.5;
aug_org = locallapfilt(ori, sigma, alpha, beta);    
imshowpair(ori, aug_org, 'montage');
 
% 2) 检测出高光区域
thresh = 0.6;   % 数值越大区域越大
augI = imextendedmax(mat2gray(ori), thresh);    % 高光区域
% local = ori(augI);
% local = imgaussfilt(augI);
% local = medfilt2(uint8(augI*1));
H = fspecial('average',15);
local = imfilter(single(augI),H,'replicate');


subplot(Nsub, 1, 2);
ori_inverse = imcomplement(ori);   % 取反
imshowpair(ori, ori_inverse, 'montage');

% 
subplot(Nsub, 1, 3);
sigma = 0.2;
alpha = 0.25;
beta = 1;
aug = locallapfilt(ori_inverse, sigma, alpha, beta);    
aug_inverse = imcomplement(aug);
imshowpair(aug, aug_inverse, 'montage');


subplot(Nsub, 1, 4);
out = double(local) .* double(aug_inverse) + (1 - double(local)) .* double(aug_org);
imshowpair(uint8(ori), uint8(out), 'montage');

4. 对高亮区域进行切分单独对子图处理后再拼接

clear;
clc;

Nsub = 5;
fig = figure;   % 返回句柄来进行图像保存

ori = imread("input\local.png");

% 对滤波后的图像转为灰度图
sigma = 0.4;
alpha = 0.2;
beta = 0.5;
aug = locallapfilt(ori, sigma, alpha, beta); 

grayImage = rgb2gray(aug);      % 转换为灰度图像
subplot(Nsub, 1, 1);   
imshowpair(aug, grayImage, 'montage');


% 对灰度图二值化处理
binaryImage = imbinarize(grayImage);

% 提取连通域
labeledImage = bwlabel(binaryImage);

% 计算每个连通域的边界框,格式为:[x, y, width, height]
stats = regionprops(labeledImage, 'BoundingBox');


% 过滤长度太小的边界框
minWidth = 9;
minHeight = 9;
boundingBoxes = zeros(0, 4);
for i = 1:numel(stats)
    w = stats(i).BoundingBox(3);
    h = stats(i).BoundingBox(4);
    if w > minWidth && h > minHeight
        boundingBoxes(end+1, :) = stats(i).BoundingBox;
    end
end


% 绘制所有高亮部分的边界框
result = insertShape(aug, 'Rectangle', boundingBoxes, 'LineWidth', 2, 'Color', 'red');
subplot(Nsub, 1, 2);  
imshowpair(aug, result, 'montage');


% 单独对高亮区域进行直方图均衡
% 对每个区域进行处理
gamma = 2.2;
J = aug;
for i = 1:size(boundingBoxes, 1)
    boundingBox = boundingBoxes(i, :);
    x = boundingBox(1); 
    y = boundingBox(2); 
    w = boundingBox(3); 
    h = boundingBox(4); 

    % 避免出现非整数
%     subImage = J(y:y+h-1, x:x+w-1, :);
%     subImage = imadjust(subImage, [], [], gamma);
%     J(y:y+h-1, x:x+w-1, :) = subImage;
    subImage = J(round(y):round(y+h-1), round(x):round(x+w-1), :);
    

    % 对区域图进行图像处理
    r = subImage(:, :, 1);
    g = subImage(:, :, 2);
    b = subImage(:, :, 3);
    r_aug = adapthisteq(r,'clipLimit',0.1,'Distribution','rayleigh');
    g_aug = adapthisteq(r,'clipLimit',0.1,'Distribution','rayleigh');
    b_aug = adapthisteq(r,'clipLimit',0.1,'Distribution','rayleigh');
    rgb = cat(3, r_aug, g_aug, b_aug);

    % subImage = imadjust(subImage, [], [], gamma);

    % 贴回去原图中
    J(round(y):round(y+h-1), round(x):round(x+w-1), :) = rgb;
end

subplot(Nsub, 1, 3);  
imshowpair(aug, J, 'montage');


% 用一个权重与原图进行叠加
w = 0.5;
out = w*J + (1-w)*ori;
subplot(Nsub, 1, 4);  
imshowpair(ori, out, 'montage');
  • 局部calth直方图处理
    在这里插入图片描述

  • 局部使用gamma

在这里插入图片描述


参考资料:https://ww2.mathworks.cn/help/index.html

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

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

相关文章

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志 (1)如果Android Studio里面没有安装下列插件之一的,在Settings的Plugins里面安装其中一个: (2)菜单栏中的code里面找到反混…

sphinx pdoc 生成API文档

文章目录 sphinxinstall pdoc sphinx install pip install sphinx sphinx_rtd_theme sphinx-autobuild pip install recommonmark sphinx_markdown_tables sphinx-quickstart 选 y Project language [en]: zh_CN conf.py: import sys sys.path.append(..)extensions [sph…

Word公式大括号左对齐

1、大括号公式如下: 2、依次选中每一行,然后在开头输入一个&,然后回车: 3、当最后一行输入完立马可以发现左对齐了: The higher I got, the more amazed I was by the view.

docker安装maven私服nexus及其配置使用

目录 docker搭建nexus登录私服管理后台重置admin密码 配置仓库 docker搭建nexus 下载 Nexus3 镜像 docker pull sonatype/nexus3创建宿主机挂载目录 mkdir –vp /usr/local/nexus-data记得修改权限 chmod 775 /usr/local/nexus-data创建 Nexus3 容器 docker run --privile…

C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException)

C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException) 代码: HttpListener listener new HttpListener(); 错误: System.PlatformNotSupportedException: Operation is not su…

采用匿名内部类形式定义Handler有什么不妥?

写这篇博客,是为分析Handler引起内存泄漏做准备。 目录 匿名内部类的含义是什么?匿名内部类的三种情况非静态内部类为什么会持有外部类的引用? 匿名内部类的含义是什么? 首先是内部类,(内部类不难理解&am…

WPS Office AI实战:一键生成PPT幻灯片

前些天WPS Office AI放出来内测申请,相信不少小伙伴都拿到了体验资格,不知道体验到国产AI的魅力没有?作为写作中的重头戏,一张PPT的制作让不少小伙伴面露难色,单排版布局这一项就足以让人望而却步。 AI 在写作中的应用…

使用EXCEL公式编程从网页获取股票数据并保存到excel

共享文件地址 在dataexcel服务器的 /示例/03函数示例/获取股票数据8.fexm 路径 公式脚本 var urlcelltext("URL");//获取单元格ID为URL的单元格内容 var txtWebGet(url); //从网页获取数据 cellvalue("data",txt); //将获取到的数据库保存到ID为DATA的单…

SSM学习笔记-------MyBatis

MyBatis学习笔记 一、入门二、XML配置1、configuration(配置)2、properties(属性)3、settings(设置)4、typeAliases(类型别名)5、typeHandlers(类型处理器)6、…

Elasticsearch Dump的详细安装和迁移es索引和数据的使用教程

前言 如果希望将数据导出到本地文件而不是通过编程方式处理,可以考虑使用Elasticsearch的导出工具,如Elasticsearch Dump(Elasticdump)或Elasticsearch Exporter。这些工具可以将Elasticsearch索引中的数据导出为可用于后续处理的…

备战秋招002(20230704)

文章目录 前言一、今天学习了什么?二、关于问题的答案1.线程池2.synchronized关键字3、volatile 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. …

vue3+wangEditor5/vue-quill自定义上传音频+视频

一.各种编辑器分析 Quill 这是另一个常用的富文本编辑器,它提供了许多可定制的功能和事件,并且也有一2个官方的 Vue 3 组件 wangEditor5 wangEditor5用在Vue3中自定义扩展音频、视频、图片菜单;并扩展音频元素节点,保证音频节…

【数据结构与算法篇】之时间复杂度与空间复杂度

【数据结构与算法篇】之时间复杂度与空间复杂度 一、时间复杂度1.1时间复杂度的定义1.2 常见的时间复杂度的计算1.2.1 常数时间复杂度( O ( 1 ) ) O(1)) O(1))1.2.2 线性时间复杂度( O ( N ) O(N) O(N))1.2.3 对数时间复杂度( O (…

蓝桥杯专题-试题版含答案-【荷兰国旗问题】【正三角形的外接圆面积】【比较字母大小】【车牌号】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

SSTI模板注入

目录 1、原理简述 2、常用payload及相关脚本 (1).__class__ (2).__class__.__base__ (3).__class__.__base__.__subclasses__() (4).__class__.__base__.__subclass…

【周末闲谈】浅谈“AI+算力”

随着人工智能技术的飞速发展,“AI算力”的结合应用已成为科技行业的热点话题,甚至诞生出“AI算力最强龙头“的网络热门等式。该组合不仅可以提高计算效率,还可以为各行各业带来更强大的数据处理和分析能力,从而推动创新和增长。 文…

ue4:Dota总结—HUD篇

1.绘制ui: DrawMoney: DrawPower: 点击ui响应事件: 点击响应显示对应的模型: 点击ui拖动模型跟随鼠标移动: 显示ui:PlayerContrler:

【JAVA】Java 开发环境配置(WIndows篇)

个人主页:【😊个人主页】 系列专栏:【初始JAVA】 文章目录 前言下载JDK配置环境变量JAVA_HOME 设置PATH设置CLASSPATH 设置变量设置参数 前言 在前篇中我们介绍了JAVA语言的诞生与发展,现在是时候去学习使用他们了。 下载JDK 首先…

常微分方程(ODE)求解方法总结(续)

常微分方程(ODE)求解方法总结(续) 1 隐式方法2 多步法2.1 二阶方法2.1.1 非自启动修恩方法2.2 开型和闭型积分公式2.3 高阶多步法 1 隐式方法 常微分方程(ODE)求解方法总结 里面介绍了我称为“正常思路”的…