数字图像处理习题

Posted 然然然儿呐_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字图像处理习题相关的知识,希望对你有一定的参考价值。

数字图像处理习题(一)


一、简答题

1. 什么是数字图像,数字图像有哪些特点

答:数字图像,是以二维数字组形式表示的图像,是二维图像用有限数字数值像素的表示。由数组或矩阵表示,其光照位置和强度都是离散的。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储和处理的图像。

​ 数字图像特点:处理的信息多数为二维信息,运算量巨大;各个像素互不独立,相关性大;数字图像占用的频带较宽。

2. 若RGB图像中每一幅红、绿、蓝都是一幅8bit图像,则该RGB图所有可能的颜色总数是多少?

答:16777216种。

​ 每幅红、绿、蓝图像都是一幅8bit图像,则每个RGB颜色色值有2^8= 256个(0-255)。所以该RGB图所有可能的颜色总数为(28)3 = 16777216。

二、编程题

1. 图像处理

1.1 图像导入、裁减显示(长宽分别为原尺寸1/2)、彩色图像灰度化、保存

  • 编程思路:

    (1)图像导入:使用 imread()函数将图像读入工作区。

    (2)剪裁(长宽分别为原尺寸1/2):首先使用size()获取图像的长宽并储存,用rect[x,y,length,width]设置参数,从某个有效的x、y坐标开始裁剪1/2的宽和高的尺寸。

    (3)显示:使用imshow()函数来显示图像文件,为了同时显示不同窗口的多幅图像,使用figure()函数。

    (3)彩色图像灰度化:将3个通道(RGB)转换成1个通道,可以直接使用rgb2gray()函数。

    (4)保存: 使用函数imwrite()来写入图像文件。

  • 源代码:

    文件名:Homework1_1.m

    close all; 
    clear; 
    clc;
    img = imread('test.jpg');                 %读取test图片(为三通道彩色图片)
    figure,imshow(img),title('原图');          %显示原图
    
    hight=size(img,1);                         %获取图像高
    width=size(img,2);                         %获取图像宽
    rect = [width/4,hight/4,width/2,hight/2];  %设置参数,从1/4的x,y坐标开始延长1/2的宽高
                                               %即图像中心区域
    imgCut=imcrop(img,rect);                   %对图片img进行rect的参数裁剪,命名为imgCut
    imwrite(imgCut,'testCut.jpg')              %将灰度化后图片保存,命名为testCut.jpg
    figure,imshow(imgCut),title('裁剪后图');    %显示裁剪后的图片
    
    imgGray = rgb2gray(img);                   %RGB图片转换为灰度图片
    imwrite(imgGray,'testGray.jpg')            %将灰度化后图片保存,命名为testGray.jpg
    figure,imshow(imgGray),title('灰度化图');   %显示灰度化后的图片
    
    %显示在一个窗口 对比结果
    figure;
    subplot(1,3,1),subimage(img);
    title('原图');
    subplot(1,3,2),subimage(imgCut);
    title('裁剪后图');
    subplot(1,3,3),subimage(imgGray);
    title('灰度化图');
    
  • 结果:

  • 分析:

    (1) 裁剪:一开始使用近似正方形比例的图片,实验结果不清晰,使自己反而开始对于宽高,长宽定义混淆。最后更换测试图片,验证。长宽即宽高。
    获得图像宽高,使用size()函数。size(A,n)如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数(高)或列数(宽)。
    参数格式为:rect[x,y,length,width]

    (2)对于图像灰度化:rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,即灰度化处理的功能。调用这个功能的格式是I = rgb2gray(RGB),意思是将真彩色图像RGB转换为灰度强度图像I 。

    (3) 图片保存:使用函数imwrite()来写入图像文件。

    (4)显示:使用imshow()函数来显示图像文件。为方便观察实验结果最后将结果与原图放在一个窗口。用subplot()函数,该函数的语法形式为subplot(m,n,p)subplot(m n p)。其中,m表示图排成m行,n表示图排成n列,p表示图所在的位置,p=1表示从左到右、从上到下的第一个位置。

2. 图像采样与量化

2.2 利用求均值方法是实现4倍降采样

  • 编程思路:

    (1)用imread()函数将图像信息转化为矩阵信息进行保存,由于图像为RGB三色,所得到的信息是三维的,因此先使用rgb2gray()函数将图像转化为二维的灰度图。

    (2)[high,width]=size(a)读取图像像素,采样for循环,步长为2,将四个像素点的值求均值后赋值给新的图片,最后现实图像。

  • 源代码:

    文件名:Homework2_2.m

    %利用求均值方法实现4倍降采样
    close all; 
    clear; 
    clc;
    img=imread('学院.jpg');            %读取原图
    img=rgb2gray(img);                %转变为灰度化图像
    [h,w]=size(img);		          %获取高宽
    newImg=zeros((h+1)/2,w/2);        %新建一个长宽为原图一半的全零矩阵
    l=1;r=1;
    for i=1:2:h-1;                    %对原图行进行遍历,步长为2
        for j=1:2:w-1;                %对原图列进行遍历,步长为2
        	newImg(l,r)=(img(i,j)+img(i+1,j)+img(i,j+1)+img(i+1,j+1))/4;
            r=r+1;
        end
        l=l+1;
        r=1;
    end
    newImg = uint8(newImg);           %图像矩阵变成uint8型
    figure;
    subplot(1,2,1),imshow(img),title('原图');
    subplot(1,2,2),imshow(newImg),title('4倍采样图');
    
  • 结果:

  • 分析:

    (1)实验所得到的四倍降采样图片的像素数量是原图的1/4,因此需要将新图的宽高设置为原图的1/2。

    (2)求均值法实现降采样需要将原图临近的四块像素的灰度值求均值。使用for循环。

    (3)每步步长为2将原图依次遍历。

2.3 手动编写量化函数,将灰度级改为8

  • 编程思路:

    (1)首先用imread()函数将图像信息转化为矩阵信息进行保存,由于图像为RGB三色,所得到的信息是三维的,因此先使用rgb2gray()函数将图像转化为二维的灰度图。

    (2)通过灰度直方图得出灰度值范围,利用线性变换将其转换为灰度级为8的图像(灰度值为0-255)。

  • 源代码:

    文件名:Homework2_3.m

    %手动编写量化函数,将灰度级改为8
    close all; 
    clear; 
    clc;
    img=imread('学院.jpg');   %读取原图
    img=rgb2gray(img);        %转变为灰度化图像
    imged=img/7*(0+255/7);    %转变为灰度级为8的图像
    
    subplot(2,2,1),imhist(img),title('灰度直方图');
    subplot(2,2,2),imshow(img),title('原灰度图像');
    subplot(2,2,3),imhist(imged),title('灰度直方图');
    subplot(2,2,4),imshow(imged),title('灰度级为8');
    
  • 结果:

  • 分析:

    关于灰度级:灰度值范围[Lmin,Lmax]内就有K个亮度值对应,称为灰度级K。为方便计算机处理,灰度级K一般以2的整数次幂表示,一般取K=256,表示共有256个灰度级。

    为了实现灰度级8的转变,因此需要8个亮度值,把0-255灰度值均匀分成2^3=8份,即为8个灰度级。第一区间赋值为0,第八区间赋值为255,中间区间以此类推。

    设灰度级为k,imged=img/(k-1)*(0+255/(k-1));

3. 图像变换

3.1 手写图像反转

  • 编程思路:

    (1)首先用imread()函数将图像信息转化为矩阵信息进行保存,由于图像为RGB三色,所得到的信息是三维的,因此先使用rgb2gray()函数将图像转化为二维的灰度图。

    (2)将图像转换为double型,图像反转线性变换后再将数据类型转换为uint8数据类型,显示图片。
    (3)灰度值为0-255,反转则为img1=255-img1

  • 源代码:

    文件名:Homework3_1.m

    %图像反转:手写
    close all; 
    clear; 
    clc;
    img=imread('学院.jpg');   %读取原图
    img=rgb2gray(img);        %转变为灰度化图像
    img1=double(img);         %图像矩阵变成double型
    img1=255-img1;            %图像反转
    img2=uint8(img1);         %图像矩阵变成uint8型
    subplot(1,2,1),imshow(img),title('原始灰度图像');
    subplot(1,2,2),imshow(img2),title('反转灰度图像');
    
  • 结果:

  • 分析:

    图像反转,“白变黑,黑变白”,因为灰度值范围为0-255,反转则为:现值=255-原值。

3.2 非线性变换完成对数变换

  • 编程思路:

    (1)用imread()函数将图像信息转化为矩阵信息进行保存,由于图像为RGB三色,所得到的信息是三维的,因此先使用rgb2gray()函数将图像转化为二维的灰度图。

    (2)把二维的灰度图矩阵转换为double型之后进行对数变换,最后转换为uint8类型显示。

  • 源代码:

    文件名:Homework3_2.m

    %非线性变换:完成对数变换
    close all; 
    clear; 
    clc;
    img=imread('学院.jpg');   %读取原图
    img=rgb2gray(img);        %转变为灰度化图像
    img1=double(img);         %图像矩阵变成double型
    img2=46*log(img1+1);      %对数变换
    img2=uint8(img2);         %图像矩阵变成uint8型
    subplot(1,2,1),imshow(img),title('原始灰度图像');
    subplot(1,2,2),imshow(img2),title('对数变换图像');
    
  • 结果:

  • 分析:

    原图经过非线性对数变换后,整体亮度变强。对数变换一般适用于处理过暗图像。

4. 直方图

4.1 完成清华大学出版社教材例5.6,5.7

  • 5.6 源代码:

    文件名:Homework4_1_6.m

    %5.6 直方图均衡化
    Image=rgb2gray(imread('img.jpg'));            %读取原图转变为灰度化图像
    histgram=imhist(Image);                       %统计图像直方图
    [h,w]=size(Image);
    NewImage=zeros(h,w);
    s=zeros(256); s(1)=histgram(1);
    for t=2:256  
        s(t)=s(t-1)+histgram(t);                   %计算新的灰度值
    end
    for x=1:w
        for y=1:h
            NewImage(y,x)=s(Image(y,x)+1)/(w*h);   %生成新图像
        end
    end
    subplot(2,2,1),imshow(Image),title('couple灰度图像');
    subplot(2,2,2),imhist(Image),title('couple灰度图像的直方图');axis tight;
    subplot(2,2,3),imshow(NewImage),title('直方图均衡化处理后的图像');
    subplot(2,2,4),imhist(NewImage),title('直方图均衡化处理后的图像的直方图');axis tight;
    
    
  • 5.7 源代码:

    文件名:Homework4_1_7.m

    %5.7 局部直方图均衡化 
    Image=rgb2gray(imread('img.jpg'));               %读取原图转变为灰度化图像
    histgram=imhist(Image);                          %统计图像直方图
    [h,w]=size(Image);
    NewImage=zeros(h,w);
    s=zeros(256); s(1)=histgram(1);
    for t=2:256
        s(t)=s(t-1)+histgram(t);                     %计算新的灰度值
    end
    for x=1:w
        for y=1:h
            NewImage(y,x)=s(Image(y,x)+1)/(w*h);     %生成新图像
        end
    end
    subplot(1,4,1),imshow(Image),title('couple灰度图像');
    subplot(1,4,2),imhist(Image),title('couple灰度图像的直方图');axis tight;
    subplot(1,4,3),imshow(NewImage),title('直方图均衡化处理后的图像');
    subplot(1,4,4),imhist(NewImage),title('直方图均衡化处理后的图像的直方图');axis tight;
    
  • 结果:

    (1)例5.6

    (2)例5.7

  • 分析:

    (1)图像直方图均衡化和局部均衡化,可使图像灰度级均衡平坦。

    (2)直方图均衡化:原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,增加许多图像的局部对比度,亮度可以更好的在直方图上分布。

    (3)局部直方图均衡化:也就是对一个像素周围的区域进行直方图均衡化,然后将结果返还给最中心的区域,需要自己确定模板的大小,一般都是奇数行,奇数列,运算时间较长,且模板越大,运算时间越长。

4.2 手写函数替换imhist()

  • 编程思路:

    可以用循环遍历图片的每个像素,求出每个灰度值出现的次数,最终进行统计展示。

  • 源代码:

    文件名:Homework4_2.m

    %手写imhist()
    close all; 
    clear; 
    clc;
    Image=rgb2gray(imread('学院.jpg')); %读取原图转变为灰度化图像
    n=256;
    k=256/n;
    histograms(n)=0;
    for i=1:1:n
        a=size(find(Image<=k*i))-size(find(Image<=k*(i-1)));
        histograms(i)=a(1);
    end
    subplot(1,2,1),imhist(Image);title('imhist()直方图');axis tight;
    subplot(1,2,2),bar(0:k:n*k-1,histograms,'grouped');title('手写代码灰度分布直方图');axis tight;
    
  • 结果:

  • 分析:

    (1)用循环遍历图片的每个像素,求出每个灰度值出现的次数,最终进行统计展示。

    (2)find函数返回原图I矩阵中等k值的下标,length计算下标的数量来表示频率.

5. 空域低通滤波

5.2 图像分别添加椒盐噪声与乘性噪声,手写实现3 * 3窗口均值滤波与中值滤波,并比交两种方法在不同噪声下的去噪效果。提示:嵌套使用for循环语句

  • 编程思路:

    (1)向灰度图像增加噪声。

    (2)获取图像高与宽,并新建新的图像矩阵,为了方便边界操作,将其高宽各增加2。

    (3)利用嵌套for循环对每一个像素点进行操作。

    (3)均值滤波:将该像素点周围包括其自己的3*3共九个灰度值求均值。

    ​ 中值滤波:将该像素点周围包括其自己的3*3共九个灰度值排序,取其均值。调用函数实现

  • 源代码:

    文件名:Homework5_2.m

    %图像分别添加椒盐噪声与乘性噪声
    %手写实现3 * 3窗口均值滤波与中值滤波
    close all; 
    clear; 
    clc;
    Image=rgb2gray(imread('img.jpg'));         %读取原图转变为灰度化图像
    ImageA1 = imnoise(Image,'speckle');        %加入乘性噪声,方差默认值
    ImageB1 = imnoise(Image, 'salt & pepper'); %加入椒盐噪声,噪声密度为0.02
    ImageA1 = double(ImageA1);
    ImageB1 = double(ImageB1);
    [h,w] = size(Image);
    ImageA2 = zeros(h+2, w+2);                 %乘性噪声均值滤波图像
    ImageA3 = zeros(h+2, w+2);                 %乘性噪声中值滤波图像
    ImageB2 = zeros(h+2, w+2);                 %椒盐噪声均值滤波图像
    ImageB3 = zeros(h+2, w+2);                 %椒盐噪声中值滤波图像
    
    for i=2:1:h-1
        for j=2:1:w-1
            % 均值滤波
            ImageA2(i,j)=(ImageA1(i-1,j-1

    以上是关于数字图像处理习题的主要内容,如果未能解决你的问题,请参考以下文章

    冈萨雷斯《数字图像处理》第3版课后习题

    第一章练习题

    LeetCode 260 只出现一次的数字(超详细)

    Python练习题 028:求3*3矩阵对角线数字之和

    笨办法学 Python(第三版)习题 3: 数字和数学计算

    习题 3 数字和数学计算