草庐IT

数字图像处理实验之Matlab对图像的基本处理

成功上岸u 2023-08-13 原文

一、运用Matlab对图像的基本处理

1、提取Lena图像的左半上角部分,与原始Lena图像在同一个figure中显示,并做适当命名

a =imread('Lena.bmp');%读取图片
[m, n, c]=size(a);%取行数m和列数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创建图窗窗口
subplot(1,2,1);%一个fugure图形生成一行两列两个子图,当前图像显示在第一个位置
imshow(a);title('原始图像')%输出图像到板块上
subplot(1,2,2);%第二个位置放更改后的图像
imshow(img_b);title('左半上角') 

效果图

2、利用 imnoise , 对原始Lena图像叠加高斯噪声,产生4幅、14幅、140幅的含噪图像。对这些含噪图像采用 相加 运算,来验证、比较图像相加消除叠加性噪声的效果。将原始图像、1幅噪声图像、1幅相加去噪结果图像显示在一个figure 中

% 利用 imnoise , 对原始Lena图像叠加高斯噪声,产生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的高斯');

%产生4幅、14幅、140幅的含噪图像。对这些含噪图像采用 相加 运算,来验证、比较图像相加消除叠加性噪声的效果。

img1=im2double(img1);                     %将img1数据类型转换成双精度
% A=im2double(A);
nos3=im2double(nos3); 


%14幅的含噪图像
for i=1:14 %i从1到14,每次增加一个,该共循环14次,每写一层循环,必须以end结尾
nos1 = imnoise(img1,'gaussian',0,0.02);
A=imadd(nos1,img1);%对原始图像和含噪图像继续叠加
% 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、利用循环逐像素点计算原始Lena图像的均值和方差

 img1=imread('Lena.bmp');
[r,c,k]=size(img1);%取图像的行数r和列数c

s=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); %按公式计算,像素值总和除以像素个数。
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) 计算数组 A 中所有值的标准差。方差=标准差^2
Matlab_img1_std1=std2(img1)^2;
% Matlab_img1_std2=var(img1(:)); % Matlab方法二:利用方差函数var求得

4、不用 imresize , 利用循环将Lena图像以nearest方式缩小2倍放大2倍 
img_11=imread('Lena.bmp');
[row,col]= size(img_11); %% 获得图像的行列数及色板数
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倍')

%利用循环将任一灰度图像以nearest方式行缩放p倍,列缩放q倍
p=input('输入行缩放倍数(大于0的任意正实数):\n');
q=input('输入列缩放倍数(大于0的任意正实数):\n');
a=imread('Lena.bmp');
[m,n,c]=size(a);
new_m=ceil(p*m);%ceil函数向上取整
new_n=ceil(q*n);
new_a=zeros(new_m,new_n,c);%zeros函数是用于返回一个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),')']);

有不懂的函数可以在这里输入相应的函数,有解释的MathWorks - MATLAB 和 Simulink的制造者 - MATLAB & Simulink

有错误的话,欢迎纠错 

有关数字图像处理实验之Matlab对图像的基本处理的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  3. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  4. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐