图像导入裁剪与灰度化

数字图像基本知识

1.什么是数字图像?数字图像处理有哪些特点?
答: 数字图像是由有限的元素组成,每一个像素的空间位置(x,y)和强度值f都被量化成离散的数值,这些元素称为像素。因此,数字图像是具有离散值的二维像素矩阵,能够存储在计算机存储器里面,方便处理。
量化:对模拟图像进行采样之后所得到的小图像块的像素值仍然是连续的,所以要对其像素值进行离散化处理,即量化。
数字图像处理特点:
1、信息量大。数字图像处理的信息大多数是二维信息,是由图像矩阵中的像素组成的,而每个像素是由红、绿、蓝三种颜色表示的,每种颜色用8位表示灰度级,一幅没有经过压缩的1024X768的真彩图像,它的数据可以达到2M。所以庞大的数据量给数字图像的存储、传输、处理都带来了困难。
2、处理精度高,再现性好。用计算机处理图像数据,其实实质就是对图像数据进行各种运算,当然这是色彩的运算。现代的扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这就意味着图像的数字化精度可以达到满足任何应用需求。
3、适用面宽。图像可以来自各种信息源。他们可以是可见光图像,也可以是不可见的光谱图像。
4、效果易于控制。在数字图像处理过程中,可以任意的改变参数,有效的控制处理过程。比如可以在PS软件中进行色相/饱和度的参数调节,从而达到预计的效果。
5、处理费时间。这点很好理解,由于数据量大,处理所需要的时间也是很多的。如果处理一个像素需要1毫秒,那么处理700X500像素的数据就将需要花费大约6分钟的时间。
6、灵活性高。图像处理大体上可以分为图像的画质改善,图像分析和图像的重建。这三部分都包含丰富的内容。
7、数字图像受人的因素影响较大。因为处理图像一般是给人观察和评价的,由于每个人的视觉系统很复杂,受环境、光线、视觉性能等诸多因素的影响。

  • 若RGB图像中的每一幅红、绿、蓝图像都是一幅8bit图像,则改RGB图像所有可能的颜色总数是多少?
    答:RGB分三原色,8bit,那么每种原色共有256个值
    所以三原色所能组成的颜色共有256256256=16777216 种。
    -编程:
    图像导入,裁剪显示(长宽分别为原尺寸1/2),彩色图像灰度化,保存。

    分析:彩色图像是具有三通道(R,G,B)的图片,而灰度图像是只具有单通道的图像,二值图像就是黑白图片,只有黑白两个颜色,所有在了解这三者的区别之后再做就方便了。
    为了得到灰度图像,可以取rgb三通道的任意一个通道的矩阵就可以,或者使用内置函数rgb2gray(实际上是用的加权取得的,可以用help rgb2gray查看文档),或者使用最大值法,平均法。下面写了对应的五种方法,请看代码。
    对于裁剪,可以用内置函数,还有就是自己根据图片大小显示对应的区域。详情请看代码。
    源代码+注释+说明
img = imread('E:\photo\matlabtest\testone.jpg'); %读取grb格式的图像
rect = [300 300 1000 1000];    %构建裁剪起始位置以及大小。
imgcrop = imcrop(img,rect);    %调用函数
imgcaijian = img(1:1250,1:720,:);
imgbw = img(:,:,1);    %直接取r,g,b其中一个二维矩阵,1,2,3,都可以。
first = rgb2gray(img);  %用函数进行灰度变换,其实就是加权平均方法, 0.299 * R + 0.587 * G + 0.114 * B
[rows,cols,colors]=size(img);  %得到原来图像的矩阵的参数
second = zeros(rows,cols);   %创建一个同样大小的全零矩阵,用来存储下面的图像
second = uint8(second); %将全零矩阵变为uint8格式,因为上面创建之后默认为double.
%平均值法      得到较为柔和的
for i = 1 : rows    %遍历行
    for j = 1: cols  %遍历列
        sum = 0;
        for k = 1 : colors %遍历三种颜色
            sum = sum + img(i,j,k)/3;  %进行转化,每次sum不能超过255
        end
        second(i,j) = sum;  %赋值给像素点
    end
end
%最大值法    得到亮度较高的
maxx = zeros(rows,cols); %创建一个同样大小的全零矩阵,用来存储下面的图像
maxx = uint8(maxx);   %将全零矩阵变为uint8格式,因为上面创建之后默认为double.
for i = 1 : rows
    for j = 1 : cols
        maxx(i,j) = max(img(i,j,:));  %取最大值
    end
end
%加权平均值法转化的图像
jiaquan = zeros(rows,cols); %创建一个同样大小的全零矩阵,用来存储下面的图像
jiaquan = uint8(jiaquan);    %将全零矩阵变为uint8格式,因为上面创建之后默认为double.
for i = 1 : rows
   for j = 1 : cols
       jiaquan(i,j) = img(i,j,1) * 0.3 + img(i,j,2) * 0.3 + img(i,j,3) * 0.4; %加权求值
   end
end
imwrite(jiaquan,"加权图像.jpeg");%保存图像为加权图像.jpeg)
figure();
subplot(2,4,1),imshow(img),title("原图");
subplot(2,4,2),imshow(imgbw),title("取任意一维");
subplot(2,4,3),imshow(imgcrop),title("裁剪的图像");
subplot(2,4,4),imshow(first),title("内置函数");
subplot(2,4,5),imshow(second),title("平均值法");
subplot(2,4,6),imshow(maxx),title("最大值法");
subplot(2,4,7),imshow(jiaquan),title("加权");
subplot(2,4,8),imshow(imgcaijian),title("裁剪");

结果:图像导入裁剪与灰度化_第1张图片

并且在当前目录保存了加权图像。

在这里插入图片描述
第一次基本入门就到此为止,路漫漫其修远兮,吾将上下而求索!

你可能感兴趣的:(数字图像处理,图像处理,计算机视觉,matlab)