MATLAB图像处理1——曝光、直方图均衡化、平滑滤波

小白一枚,有错误之处还请指出,谢谢~

1、曝光:

1)双重曝光

clc;clear;
picname='xinyi.tif';
picname1='xiaolan.tif';
x=double(imread(picname))/255;
%实现归一化,读入的类型是无符号的8位整型,
%相当于0-255的所有整数,为了计算准确,必须先化为double型。
%再除以255,这样图像矩阵的值全部都在0-1之间。
x1=double(imread(picname1))/255;
subplot(2,2,1);
imshow(x);
title('原图1');
subplot(2,2,2);
imshow(x1);
title('原图2');
alpha=0.3;
picinfo=imfinfo(picname);
for i=1:picinfo.Height
    for j=1:picinfo.Width
        for k=1:3
            Y(i,j,k)=alpha*x(i,j,k)+(1-alpha)*x1(i,j,k);
%a,b是两幅图像,k是系数。由于两幅彩色图像都是三维的,
%所以循环要跑三个方向,进行图片的叠加
        end
    end
end
subplot(2,2,3);
pause(2)
imshow(Y)
title('双重曝光后的图');


效果图

另一种代码:

im1=imread('1.jpg');  %导入图片1
im2=imread('2.jpg');  %导入图片2
im3=imresize(im2,[1440,1440]);%修改图片2尺寸使得图片1和2等大
im_add=imadd(im1,im3);%图片1和修改后的图片2合成
figure ; subplot(2,2,1) ; 
imshow(im1) ; 
title('图1');
subplot(2,2,2) ; 
imshow(im3);%同时展示图片1和修改后的2
title('图2');
subplot(2,2,[3,4]);
imshow(im_add);%展示合成图片
title('二重曝光后的效果图');

但曝光效果不是很好

 

 2)三重曝光

>> im1=imread('1.jpg');%读取图片
>> im2=imread('2.jpg');
>> im3=imread('3.jpg');
>> im4=imresize(im2,[1048,1200]);%调整图2大小,与图1大小相同
>> im5=imresize(im3,[1048,1200]);%调整图3大小,与图1大小相同
>> im_add=uint8(0.4*im1+0.3*im4+0.3*im5);%按比例放大
>> imshow(im1) ;
>> title('图一');
>> subplot(2,3,2) ;
>> imshow(im4); 
>> title('图二');
>> subplot(2,3,3);
>> imshow(im5);
>> title('图三');
>> subplot(2,3,[4,6]);
>> imshow(im_add);
>> title('处理后的效果图');

 

 

2、直方图均衡化

clc ;clear
%% 直方图均衡
A = imread('autumn.tif');%读取图像
A=rgb2gray(A);%将图片灰度化
[J,T] = histeq(A);%直方图均衡化,T为直方图的值
%% Image display
figure(1);%建立空白图像
subplot(3, 2, 1);
imshow(A);
title('原图');
subplot(3, 2, [3 4]);
imhist(A);%显示原图的直方图
title('原图的直方图');
subplot(3, 2, 2);%画出均衡化后的图及直方图
imshow(J);
title('均衡化的图');
subplot(3,2, [5 6]);
imhist(J);
title('均衡化后的直方图');

效果图

 3、平滑滤波(中值滤波,均值滤波,梯度倒数):加噪声

1)椒盐噪声

clear; close all; clc
%% 图像读取、灰度化与加椒盐噪音
I = imread('xinyi.tif');%读取图像
I=rgb2gray(I);%调用函数,处理图像使之灰度化
J = imnoise(I,'salt & pepper');%椒盐噪声
%% 中值滤波
z_J=medfilt2(J);%中值滤波函数
%% 均值滤波
h0=1/9.*[1 1 1 1 1 1 1 1 1];%定义平滑模板
p_J=filter2(h0,J);
p_J=uint8(p_J);
%% 梯度倒数
t_J=double(J);%转化图像为double型
[GX,GY]=gradient(t_J);%求图像梯度
G=sqrt(GX.*GX+GY.*GY);
%% Image display
figure
subplot(3,2,1),imshow(I);%输出图像
title('原图像')%给原图像加标题
subplot(3,2,2),imshow(J);%输出图像
title('加椒盐噪声后图像')%给原图像加标题
subplot(3,2,3),imshow(z_J);%输出图像
title('中值滤波后图像')%给图像加标题
subplot(3,2,4),imshow(p_J);%输出图像
title('均值滤波后图像')%给图像加标题
subplot(3,2,5),imshow(G/255,[]);%把double类型换回unit8类型输出
title('梯度倒数后图像')

效果图

 2)高斯噪声

clear; close all; clc
%% 图像读取、灰度化与高斯噪声
I = imread('xinyi.tif');%读取图像
I=rgb2gray(I);%调用函数,处理图像使之灰度化
J = imnoise(I,'gaussian');%高斯噪声
%% 中值滤波
z_J=medfilt2(J);%中值滤波函数
%% 均值滤波
h0=1/9.*[1 1 1 1 1 1 1 1 1];%定义平滑模板
p_J=filter2(h0,J);
p_J=uint8(p_J);
%% 梯度倒数
t_J=double(J);%转化图像为double型
[GX,GY]=gradient(t_J);%求图像梯度
G=sqrt(GX.*GX+GY.*GY);
%% Image display
figure
subplot(3,2,1),imshow(I);%输出图像
title('原图像')%给原图像加标题
subplot(3,2,2),imshow(J);%输出图像
title('加高斯噪声后图像')%给原图像加标题
subplot(3,2,3),imshow(z_J);%输出图像
title('中值滤波后图像')%给图像加标题
subplot(3,2,4),imshow(p_J);%输出图像
title('均值滤波后图像')%给图像加标题
subplot(3,2,5),imshow(G/255,[]);%把double类型换回unit8类型输出
title('梯度倒数后图像')

效果图

补充:图像噪声的添加为了完成多种图像处理的操作和试验,还可以对图片添加噪声。所用函数为imnoise (I, type),该函数中的type可以为5种噪声参数,分别为:'gaussian'(高斯白噪声),'localvar'(与图象灰度值有关的零均值高斯白噪声),'poisson'(泊松噪声),'salt & pepper'(椒盐噪声)和'speckle'(斑点噪声)。

另一种代码:

1)椒盐噪声+均值滤波

>> im1=imread('11.jfif');
>> im2=rgb2gray(im1);
>> im3=imnoise(im2,'salt & pepper',0.05);
>> im4=MeanFilter(im3);调用函数
>> figure;subplot(121);imshow(im3);subplot(122);imshow(im4);

函数创建(均值滤波)
function [ filtered ] = MeanFilter( noise )
filtered = noise;
h = size(filtered, 1);
w = size(filtered, 2);
for i= 1:h
    for j=1:w
        up=max(i-1,1);
        down=min(i+1,h);
        left=max(j-1,1);
        right=min(j+1,w);
        filtered(i,j)=mean(mean(noise(up:down,left:right)));
    end
end
end

2)椒盐噪声+中值滤波

>> im1=imread('11.jfif');
>> im2=rgb2gray(im1);
>> im3=imnoise(im2,'salt & pepper',0.05);
>> im4=MedianFilter(im3);
>> figure;subplot(121);imshow(im3);subplot(122);imshow(im4);

函数(中值滤波)
function [ filtered ] = MedianFilter( noise )
    filtered = noise;
    h = size(filtered, 1);
    w = size(filtered, 2);
    for i = 1 : h
        for j = 1 : w
            up = max(i - 1, 1);
            down = min(i + 1, h);
            left = max(j - 1, 1);
            right = min(j + 1, w);
            sub = noise(up : down, left : right);
            sub = sub(:);
            filtered(i, j) = median(sub);
        end
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值