MATLAB图像处理实现高光抑制

下面是的几个用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 > minHeightboundingBoxes(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;
endsubplot(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.hqwc.cn/news/9639.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【花雕】全国青少年机器人技术一级考试备考实操搭建手册10

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

目标检测的评估指标

Precision(精确率/查准率):是指在所有被预测为正的样本中,确实是正样本的占比。当Precision越大时,FP越小,此时将其他类别预测为本类别的个数也就越少,可以理解为预测出的正例纯度越高。Precision越高,误检…

ORA-01122 ORA-01200故障处理---惜分飞

由于某种原因客户的数据库启动报ORA-01122 ORA-01200错误 让客户把system01.dbf文件发给我进行分析,发现system01.dbf文件大于32G(在8k的blocksize库中,默认情况system01.dbf文件不会超过32G),这个明显异常 检测坏块情况发现4096000之后的block全部为全0块 通过bbed分析文…

uniapp-设置全屏

需求&#xff1a;就是想要小程序不受限制&#xff0c;可以把图片或者文字全屏的展示&#xff0c;如下图 vue代码如下&#xff1a; <template><view class"content"><image class"image-bg" src"/static/logo.png" /><imag…

学生成绩管理系统的设计与实现(论文+源码)_kaic

摘要 该系统在开发过程中&#xff0c;要注意使其与业务流程的运作相一致&#xff0c;力争使该系统全面&#xff0c;通用&#xff0c;以便该系统不仅适用于教育机构。在开发方法的选择上&#xff0c;选择生命周期方法和原型方法&#xff0c;并按照四个主要阶段的系统研究&#x…

Jvm jmx_exporter Prometheus dubbo Grafana 重点看端口要对应上 单独进程和程序进程内jmx_exporter

目录 JMX Exporter 的两种用法 启动独立进程 jmx_prometheus_httpserver-0.18.0.jar 方式 下载 jmx_exporter 找地方随便一放 创建配置文件 config_jmx_exporter.yaml 增加 启动 jvm 配置 一定要是jvm参数 可别意外写成程序参数 启动jmx_exporter Prometheus yml 配置 …

php://input文件包含

实验目的 通过本实验&#xff0c;了解php封装伪协议&#xff0c;掌握php://input文件包含的用法 实验环境 操作机&#xff1a;kali 靶机&#xff1a;Windows 实验地址&#xff1a;http://靶机ip/exp/include2/input/input2/ 工具&#xff1a;burpsuite 用户名&#xff1a…

UE4/5用贴图和GeneratedDynamicMeshActor曲面细分与贴图位移制作模型

目录 制作逻辑&#xff1a; ​编辑 曲面细分函数&#xff1a; 添加贴图逻辑&#xff1a; 代码&#xff1a; 制作逻辑&#xff1a; 在之前的文章中&#xff0c;我们使用了网格细分&#xff0c;而这一次我们将使用曲面细分函数&#xff0c;使用方法和之前是一样的&#xff1a…

k8s中kubectl陈述式/声明式资源管理

k8s陈述资源管理方法的说明 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信息&…

Linux-vim与gdb与make/makefile

三个模式&#xff1a;命令模式 文本模式 底行模式 yum :instell 安装 remove 卸载 gcc -o执行后生成文件命名 gcc 1.c -o fst.out -E预编译 -S汇编 -c生成机器码 Linux 中 静态库&#xff1a;.a&#xff1b;动态库&#xff1a;.so Linux默认动态库&#xff0c;…

文心一言 VS 讯飞星火 VS chatgpt (55)-- 算法导论6.3 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;55&#xff09;-- 算法导论6.3 1题 一、参照图6-3 的方法&#xff0c;说明 BUILD-MAX-HEAP在数组 A(5&#xff0c;3&#xff0c;17&#xff0c;10&#xff0c;84&#xff0c;19&#xff0c;6&#xff0c;22&#xff0c;9)上的操作…

海睿思分享 | ChatGPT梦幻联动,解锁企业数字化转型新可能

在当今这个充满活力和变化的世界里&#xff0c;人工智能 (AI) 的迅速发展正在改变着我们的生活方式。它不仅提高了我们的工作效率&#xff0c;而且正在重新定义我们的日常生活&#xff0c;以前所未有的方式提高了我们的生活质量。其中&#xff0c;以ChatGPT为代表的语言生成模型…