基于点运算、直方图、空域滤波的图像增强matlab代码及结果评估

1.总述

处理过程中具体使用到的算法结构如下:

用到的结果评价指标为:PSNR、SSIM和MSE。

2.各部分matlab代码

(0)前期准备代码
close all;
clear all;
clc;

path='F:\work_files\image/';%图像所在文件夹路径
img='image1.tif';%图像名称
o=strcat(path,img);
image=imread(o);
figure,imhist(image);
title('input');
ylim('auto');

dian_xianxing=hanshu1(image,path,img);%线性灰度变换
dian_duishu=hanshu2(image,path,img);%对数变换)
zhi_HE=hanshu3(image,path,img);%直方图均衡化
zhi_AHE=hanshu4(image,path,img);%自适应直方图均衡化
zhi_guiding=hanshu5(image,path,img);%直方图规定化
kong_imfilter=hanshu6(image,path,img);%线性滤波
kong_medfilt2=hanshu7(image,path,img);%中值滤波-medfilt2
kong_ordfilt2=hanshu8(image,path,img);%顺序统计滤波-ordfilt2
kong_wiener2=hanshu9(image,path,img);%自适应滤波-wiener2
(1)点运算
%点运算
% %(1)线性灰度变换
function output=hanshu1(image,path,img)
output=imadjust(image,stretchlim(image),[]);%线性灰度变换
I=strcat('点_线性灰度_',img);
s=strcat(path,I);
imwrite(output,s);%构造结果图像保存路径
end
% %(2)非线性灰度变换(以对数变换为例)
function output=hanshu2(image,path,img)
output=im2uint8(mat2gray(log(double(image)+1)));%对数变换C=1 %log的底数只有e,2,10若干
I=strcat('点_对数_',img);
s=strcat(path,I);
imwrite(output,s);
end
(2)直方图
%直方图
% %(1)直方图均衡化
function output=hanshu3(image,path,img)
output=histeq(image);
I=strcat('直_均衡化_',img);
s=strcat(path,I);
imwrite(output,s);
end
% %(2)自适应直方图均衡化
function output=hanshu4(image,path,img)
output=adapthisteq(image);
I=strcat('直_自适应_',img);
s=strcat(path,I);
imwrite(output,s);
end
% %(3)直方图规定化
function output=hanshu5(image,path,img)
p=twomodegauss(0.15, 0.05,0.75, 0.05, 1,0.07, 0.002);%参数要根据原始图像的直方图更改
output=histeq(image,p);
I=strcat('直_规定化_',img);
s=strcat(path,I);
imwrite(output,s);
figure,imhist(output);
title('output');
ylim('auto');
end
%设定匹配直方图函数
function p=twomodegauss(m1,sig1,m2,sig2,A1,A2,k)
c1=A1*(1/((2*pi)^0.5)*sig1); 
k1=2*(sig1^2);
c2=A2*(1/((2*pi)^0.5)*sig2); 
k2=2*(sig2^2);
z=linspace(0,1,256);
p=k+c1*exp(-((z-m1).^2)./k1)+ c2* exp(-((z-m2).^2)./k2);
p=p./sum(p(:));
figure, plot(p);
xlim([0 255]);
end

注:在直方图规定化中,需要设置提前规定好的直方图,此处按照书中设置了一个twomodegauss函数来生成规定的直方图,该直方图样式如下:

(3)空域滤波

下面有关设置核大小的部分,均设置为5×5大小。

% 空域滤波
% %(1)线性空域滤波
%1.imfilter
function output=hanshu6(image,path,img)
Filter=ones(5,5)/25;    %建立滤波器
output=imfilter(image,Filter);%相关
I=strcat('空_线性_',img);
s=strcat(path,I);
imwrite(output,s);
end

% %(2)非线性空域滤波
%1.中值滤波-medfilt2
function output=hanshu7(image,path,img)
output=medfilt2(im2double(image));
I=strcat('空_中值_',img);
s=strcat(path,I);
imwrite(output,s);
end
%2.最大/最小排序滤波-ordfilt2
function [output1,output2]=hanshu8(image,path,img)
output1=ordfilt2(im2double(image),1,ones(5,5));    %排序滤波取最小值
I=strcat('空_最小_',img);
s=strcat(path,I);
imwrite(output1,s);
output2=ordfilt2(im2double(image),25,ones(5,5));   %排序滤波取最大值
I=strcat('空_最大_',img);
s=strcat(path,I);
imwrite(output2,s);
end
%3.自适应滤波
function output=hanshu9(image,path,img)
output=wiener2(im2double(image),[5,5]);
I=strcat('空_自适应_',img);
s=strcat(path,I);
imwrite(output,s);
end

3.结果

4.评价指标

由上述代码得到的生成结果与原始图像保存在同一个文件夹中

若要运行下一代码,则需要手动先将每一幅原始图像得到的结果图像分别保存到同一文件夹中

ref_image=imread('F:\work_files\image/image1.tif');%原始图像路径
folder = 'F:\work_files\image/1/'; %原始图像对应生成结果保存路径
cd(folder) %进入指定文件夹中
files = dir('*.tif'); 
for i=1:length(files)
    filename = files(i).name;
    disp(filename);
    enh_image=imread(strcat(folder,filename));
    M=immse(ref_image,enh_image);
    disp(M);
    P=psnr(ref_image,enh_image);
    disp(P);
    [s1,s2]=ssim(ref_image,enh_image);
    disp(s1);
end

5.结果文档分享

链接:https://pan.baidu.com/s/1Ayic7HmHy1XXsTFEpB1wLg 
提取码:txzq

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwyjqkg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值