一、運用Matlab對圖像的基本處理
1、提取Lena圖像的左半上角部分,與原始Lena圖像在同一個figure中顯示,并做適當命名
a =imread('Lena.bmp');%讀取圖片
[m, n, c]=size(a);%取行數(shù)m和列數(shù)n
half_x=floor(m/2);%floor是對m/2的結果取整,向下取整;ceil向上取整
half_y=floor(n/2);
img_b=a(1:half_x,1:half_y,:);%取左半上角
figure;%figure創(chuàng)建圖窗窗口
subplot(1,2,1);%一個fugure圖形生成一行兩列兩個子圖,當前圖像顯示在第一個位置
imshow(a);title('原始圖像')%輸出圖像到板塊上
subplot(1,2,2);%第二個位置放更改后的圖像
imshow(img_b);title('左半上角')?
效果圖
2、利用 imnoise ,?對原始Lena圖像疊加高斯噪聲,產(chǎn)生4幅、14幅、140幅的含噪圖像。對這些含噪圖像采用 相加?運算,來驗證、比較圖像相加消除疊加性噪聲的效果。將原始圖像、1幅噪聲圖像、1幅相加去噪結果圖像顯示在一個figure 中
% 利用 imnoise , 對原始Lena圖像疊加高斯噪聲,產(chǎn)生4幅含噪圖像
% g=imnoise(圖像名稱,‘gaussian’,m,var) ?均值m,方差為var的高斯噪聲添加到原圖像上,默認值均值是0,方差為0-1
img1=imread('Lena.bmp'); %圖形文件讀取圖像MATLAB空間 ?A = imread(filename)
%高斯噪聲,圖像是img,均值為0,方差為
nos1 = imnoise(img1,'gaussian',0,0.02);
nos2=imnoise(img1,'gaussian',0,0.03);
nos3=imnoise(img1,'gaussian',0,0.05);
nos4=imnoise(img1,'gaussian',0,0.07);
figure('Name','原始圖像和4幅的含噪圖像');
subplot(2,3,1); imshow(img1); title('原圖');%兩行三列第一張圖
subplot(2,3,2); imshow(nos1); title('方差0.02的高斯');
subplot(2,3,3); imshow(nos2); title('方差0.03的高斯');
subplot(2,3,4); imshow(nos3); title('方差0.05的高斯');
subplot(2,3,5); imshow(nos4); title('方差0.07的高斯');
%產(chǎn)生4幅、14幅、140幅的含噪圖像。對這些含噪圖像采用 相加 運算,來驗證、比較圖像相加消除疊加性噪聲的效果。
img1=im2double(img1); ? ? ? ? ? ? ? ? ? ? %將img1數(shù)據(jù)類型轉換成雙精度
% A=im2double(A);
nos3=im2double(nos3);?
%14幅的含噪圖像
for i=1:14 %i從1到14,每次增加一個,該共循環(huán)14次,每寫一層循環(huán),必須以end結尾
nos1 = imnoise(img1,'gaussian',0,0.02);
A=imadd(nos1,img1);%對原始圖像和含噪圖像繼續(xù)疊加
% figure();imshow(nos1); %將14幅圖像顯示出來
end
% figure('Name','原始圖像與nos1的疊加');imshow(A);
avg_A=A/15;%求疊加后的平均圖像
%140幅的含噪圖像
for i=1:140?
? ? ? ?nos3 = imnoise(img1,'gaussian',0,0.05);
? ? ? ?B=imadd(nos3,img1);%對原始圖像和含噪圖像3疊加
% figure();imshow(nos3);?
end
% figure('Name','原始圖像與nos3的疊加');imshow(B);
figure('Name','綜合');
subplot(1,3,1);imshow(img1);title('原始圖像');
subplot(1,3,2);imshow(nos1);title('噪聲圖像');
subplot(1,3,3);imshow(avg_A);title('相加去噪結果圖像');
二、熟悉Matlab基本編程
1、利用 imresize?,?采用nearest方法先將Lena縮小2倍后再分別采用nearest、bilinear、bicubic方法放大4倍,顯示在不同的Figure中
I=imread('Lena.bmp');
I_shrink_2_nearest=imresize(I,0.5,'nearest');%Lena縮小2倍
figure; imshow(I); title('原圖');
figure; imshow(I_shrink_2_nearest);title('nearest:縮小2倍的圖')
?
I_magnify_4_nearest=imresize(I_shrink_2_nearest,4,'nearest');%用nearest方法將I_shrink_2_nearest 放大4倍
figure; imshow(I_magnify_4_nearest);title('nearest:放大4倍的圖')
%用bilinear方法 將I_shrink_2_nearest 放大4倍
I_magnify_4_bilinear=imresize(I_shrink_2_nearest,4,'bilinear');
figure; imshow(I_magnify_4_bilinear);title('bilinear:放大4倍的圖')
%用bicubic方法 將I_shrink_2_nearest 放大4倍的圖
I_magnify_4_bicubic=imresize(I_shrink_2_nearest,4,'bicubic');
figure; imshow(I_magnify_4_bicubic);title('bicubic:放大4倍的圖')
2、利用循環(huán)逐像素點計算原始Lena圖像的均值和方差
?img1=imread('Lena.bmp');
[r,c,k]=size(img1);%取圖像的行數(shù)r和列數(shù)cs=0;
for x=1:r %從1遍歷到r行
? ? for y=1:c %從1遍歷到c列
? ? ? ?s=s+img1(x,y);%求像素值總和 s ?, img1(x,y)表示位于某個坐標下的像素值
? ? end
end ?
img1_mean = s/(r*c); %按公式計算,像素值總和除以像素個數(shù)。
Matlab_img1_mean1=mean2(img1); %Matlab方法一 : mean2()矩陣元素的平均值或均值
Matlab_img1_mean2=mean(mean(img1)); %Matlab方法二: 先計算列向量均值,再求總均值。temp=0;
for i =1:r
? ? for j =1:c
? ? ? ? temp=temp+(img1(x,y)-img1_mean)^2; %求得所有像素與均值的平方和。
? ? end
end
img1_var = temp/(r*c-1); %利用方差公式求得% Matlab方法一: B = std2(A) 計算數(shù)組 A 中所有值的標準差。方差=標準差^2
Matlab_img1_std1=std2(img1)^2;
% Matlab_img1_std2=var(img1(:)); % Matlab方法二:利用方差函數(shù)var求得
4、不用 imresize , 利用循環(huán)將Lena圖像以nearest方式縮小2倍放大2倍?
img_11=imread('Lena.bmp');
[row,col]= size(img_11); %% 獲得圖像的行列數(shù)及色板數(shù)
p=0.5;
q=0.5;
m=round(p*row); ?% 新圖像行
n=round(q*col); ?% 新圖像列
for i=1:m
? ? for j=1:n
? ? ? ? ? ? x=round(i/p);
? ? ? ? ? ? y=round(j/q);
? ? ? ? ? ? new_img_11(i,j)=img_11(x,y,:);
? ? ? ? end
? ? end
b=uint8(new_img_11);
figure;
imshow(b);title('最鄰近插值縮小2倍放大2倍')
%利用循環(huán)將任一灰度圖像以nearest方式行縮放p倍,列縮放q倍
p=input('輸入行縮放倍數(shù)(大于0的任意正實數(shù)):\n');
q=input('輸入列縮放倍數(shù)(大于0的任意正實數(shù)):\n');
a=imread('Lena.bmp');
[m,n,c]=size(a);
new_m=ceil(p*m);%ceil函數(shù)向上取整
new_n=ceil(q*n);
new_a=zeros(new_m,new_n,c);%zeros函數(shù)是用于返回一個double類零矩陣
for i=1:new_m
? ? for j=1:new_n
? ? ? ? % 縮放后的圖像坐標在原圖像處的位置
? ? ? ? x=round(i/p);
? ? ? ? y=round(j/q);
? ? ? ? if (x<1)?
? ? ? ? ? ? x=1;
? ? ? ? end
? ? ? ? if (x>m)?
? ? ? ? ? ? x=m;
? ? ? ? end
? ? ? ? if (y<1)
? ? ? ? ? ? y=1;
? ? ? ? end
? ? ? ? if (y>n)
? ? ? ? ? ? y=n;
? ? ? ? end
? ? ? ? % 將縮放后的圖像坐標在原圖像處的位置的灰度值賦值給縮放后的圖像
? ? ? ? new_a(i,j,:)=a(x,y,:);
? ? end
end
new_a=uint8(new_a);
figure;
imshow(a);%顯示坐標軸
axis on
title(['原圖像(大小為:',num2str(m),'X',num2str(n),'X',num2str(c),')']);%轉換成字符串表示形式
figure;imshow(new_a);
axis on
title(['縮放后的圖像(大小為:',num2str(new_m),'X',num2str(new_n),'X',num2str(c),')']);
有不懂的函數(shù)可以在這里輸入相應的函數(shù),有解釋的MathWorks - MATLAB 和 Simulink的制造者 - MATLAB & Simulink文章來源:http://www.zghlxwxcb.cn/news/detail-435690.html
有錯誤的話,歡迎糾錯?文章來源地址http://www.zghlxwxcb.cn/news/detail-435690.html
到了這里,關于數(shù)字圖像處理實驗之Matlab對圖像的基本處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!