#1 rgb图像转变为灰度图像
%将一副真彩色图像转化为灰度图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
X=imread('tax.png');%将tax文件内容赋值给X
I=rgb2gray(X);%将X转变为灰度图像,然后赋给I
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
subplot(121),imshow(X);%共1行,2列,其中第一行第一列显示X,即原本RGB图像
subplot(122),imshow(I);%第一行第二列显示转换后的灰度图像
#2 8位伪彩色图像转为灰度图像
%将一副真彩色图像转化为灰度图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
[X,map]=imread('corn.bmp');%将tax文件内容赋值给X,对应调色板赋值给map
newmap=rgb2gray(map);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
figure,imshow(X,map);%显示原本RGB图像
figure,imshow(X,newmap);%显示转换后的灰度图像
此处要注意,输入的图像必须是有RGB三个通道的图像,否则会报错,可以使用画图生成一个256色图像,即伪彩色图像。用#1代码处理#2中的图像同样会报错。
#基于12的尝试
%将一副真彩色图像转化为灰度图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
X=imread('corn.bmp');%将tax文件内容赋值给X,对应调色板赋值给map
I=im2gray(X);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
figure,imshow(I);
尝试了一下使用im2gray函数,可以无视位深度转换为灰度图像。
#3 将灰度图像调整索引数目,也就是调整灰度分级
%将一副真彩色图像转化为灰度图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
X=imread('tax24.bmp');%将tax文件内容赋值给X
I=rgb2gray(X);%将X转变为灰度图像,然后赋给I
[Y,map]=gray2ind(I,64);%灰度图像向索引图像转换,I后面的数字表示索引表的索引数目
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
subplot(121),imshow(I);%显示原本RGB图像
subplot(122),imshow(I,map);%显示转换后的灰度图像
视频中老师分了8级,但是讲解时有口误,24位灰度图像和8位灰度图像所包含的信息量没有任何区别,只是三个字节都存储了同一个灰度信息,而gary2ind()函数中,后面的数字含义是将原本的灰度图像变为与gray2ind函数中第二个数字参数等同级数的索引表,也就是将原本的256级灰度变为与数字相同的等级,样例程序中即分为64级。
#4 将灰度图像转换为二值图像
%将灰度图像转换为二值图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
X=imread('tax24.bmp');%将tax文件内容赋值给X
I=rgb2gray(X);%将X转变为灰度图像,然后赋给I
BW1=im2bw(I,0.4);
BW2=im2bw(I,0.6);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
subplot(131),imshow(I);%显示原本RGB图像
subplot(132),imshow(BW1);%显示转换后的灰度图像
subplot(133),imshow(BW2);%显示转换后的灰度图像
im2bw中的数字表示阈值,阈值越高,白色部分越少,黑色部分越多,即高于阈值变为白,低于阈值变为黑。
#5 将伪彩色图像转换为黑白图像
%将一副真彩色图像转化为灰度图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
[X,map]=imread('corn.bmp');%将tax文件内容赋值给X,对应调色板赋值给map
BW=im2bw(X,map,0.6);
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
figure,imshow(X,map);%显示原本RGB图像,figure用于开窗口
figure,imshow(BW);%显示转换后的灰度图像
im2bw可以直接将伪彩色图像转换为二值图像,不过要注意伪彩色图像在处理的时候需要带着map参数,读取的时候同样也要带map参数。如果不带map参数,同样也能处理,不过处理结果不同。
#6 psnr计算代码尝试
%读取文件
%https://blog.csdn.net/weixin_29732003/article/details/122569893
img1 = imread('文件1完整地址');
img2 = imread('文件2完整地址');
%文件处理
psnr=PSNR(img1,img2)
function [ output ] = PSNR( img1,img2)
%PSNR 峰值信噪比
if sum(sum(img1-img2)) == 0
error('Those pictures are the same');
end
MAX=16777216; %图像有多少灰度级,此处的灰度级是直接2^位数吗
% 归一化
if (max(max(img1))-min(min(img1))) ~= 0
img1 = (img1-min(min(img1)))./(max(max(img1))-min(min(img1)));
end
if (max(max(img2))-min(min(img2))) ~= 0
img2 = (img2-min(min(img2)))./(max(max(img2))-min(min(img2)));
end
%
MSE=sum(sum((img1-img2).^2))/(1024*1024); %图片像素设为1024 x 1024
output=20*log10(MAX/sqrt(MSE)); %峰值信噪比
end
#7(P7) 使用imshow函数在显示的同时限制灰度
%设置灰度级或者设置灰度级上下限来显示图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
X=imread('corn.bmp');%此处的corn.bmp是8位伪彩色图像,对于8位伪彩色图像
%不使用[X,map]=imread('corn.bmp')这种带索引表的方式,而是直接读的话,读到的是
%没有索引表的灰度图像
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[1 1 1]);
subplot(121),imshow(X);
subplot(122),imshow(X,[50,70]);%设置灰度上下限为[50,70],中间值不变,显示该
% 灰度图像,低于50的作黑像素,高于70的作白像素。
imread函数在读取8位伪彩色图像时,如果只用一个数组变量X来读入,也就是X=imread(‘’);则没有读入索引表,导致直接显示X时得到的是没有索引表的灰度图像,而不是伪彩色图像,而且这个灰度图像与伪彩色转灰度rgb2gray函数转换出来的也不是同一个灰度图像。只有用[X,map]来读取,同时显示的时候也要同时带着X和map才能显示出原本的伪彩色图像。而且imshow(X,[x1,x2])这种用法也只对灰度图生效,对真彩色图使用是无效的,也没有imshow(X,map,[x1,x2])这种用法。
#8(p7)利用函数imshow(),image(),imagesc()显示图像进行比较,添加标尺
%利用函数imshow(),image(),imagesc()显示图像进行比较,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
[I,map]=imread('corn.bmp');%此处的corn.bmp是8位伪彩色图像,对于8位伪彩色图像
X=im2gray(I);
%不使用[X,map]=imread('corn.bmp')这种带索引表的方式,而是直接读的话,读到的是
%没有索引表的灰度图像
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[1 1 1]);
subplot(2,2,1),imshow(X);
subplot(2,2,2),image(X);%image()也可用于显示图像,但为什么显示的是蓝黄色?
subplot(2,2,3),image([80,100],[90,170],X);%利用函数image显示
% 坐标后的图像,其中[80,100]是列的标尺,[90,170]是行的标尺
subplot(2,2,4),imagesc(X,[100,150]);%利用函数imagesc()显示
% 经过灰度拉伸后的图像
出现一个问题,可能是因为使用的源文件是8位伪彩色图像,但是已经使用im2gray将伪彩色处理为灰度图像,后续图像都是对灰度图像进行操作,为什么显示出来的图像不是灰度图像而是彩色图像?
#9 利用colorbar()函数添加颜色条
%利用函数imshow()表示图像并添加颜色条,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
[I]=imread('corn.bmp');%此处的corn.bmp是8位伪彩色图像,对于8位伪彩色图像
H=[1 2 1;0 0 0;-1 -2 -1];%设置sobel算子
X=filter2(H,I);%对灰度图像进行二次滤波,实现边缘检测
%不使用[X,map]=imread('corn.bmp')这种带索引表的方式,而是直接读的话,读到的是
%没有索引表的灰度图像
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[1 1 1]);
subplot(2,2,1),imshow(X);
subplot(2,2,2),imshow(X,[]),colorbar();%image()也可用于显示图像,但为什么显示的是蓝黄色?
subplot(2,2,3),imshow(X,[]),colorbar('east');
#10 利用函数montage()同时显示多帧图像序列
%利用函数montage()同时显示多帧图像序列,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
I=zeros(128,128,1,27);%建立一个四维数组,其中所有值均为0
for i=1:27
[I(:,:,:,i),map]=imread('mri.tif',i);
end
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
montage(I,map);
#11 利用函数subimage()显示多幅图像
%利用函数subimage()显示多幅图像,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
load trees;%导入图像文件trees.mat,将其中的变量载入workspace中
[X1,map1]=imread('forest.tif');%读取图像信息
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
subplot(2,2,1),subimage(X,map);
subplot(2,2,2),subimage(X1,map1);%系统提示尽量不要使用subimage而是使用imshow,而且事实证明两个函数没有明显差别,只是subimage显示了标尺
subplot(2,2,3),imshow(X,map);
subplot(2,2,4),imshow(X1,map1);
matlab中自带了很多图像可以直接调用
#12 利用函数impixel()显示图像制定像素信息
%利用函数impixel()显示图像制定像素信息,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
RGB=imread('peppers.png');
c=[10,11,12];%新建一个向量,存放像素纵坐标,%为什么是三维向量?坐标不是一个数字就够了吗
%经过实验得出结论,c是一个向量, r也是一个向量,impixel函数在读取坐标的时候会
%分别从两个向量中的同一位置读取,以本代码中的c和r为例,就是读取[10,20],[11,21],[12,22]中的像素
%两个向量的作用是分别存储横坐标和纵坐标,向量的长度代表所要取的点的数目。
r=[20,21,22];%新建一个向量,存放像素横坐标
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
pixels1=impixel(RGB)%impixel会打开一个窗口,并等待用户使用鼠标选择图像中的像素
pixels2=impixel(RGB,c,r)
在impixe(RGB,c,r)代码中,c和r两个向量分别存储横坐标与纵坐标,两个向量的长度要相等,向量的长度代表了所取点的个数。
#12 利用函数impixelinfo()显示鼠标所在像素位置以及像素信息
%利用函数impixelinfo()显示鼠标所在像素位置以及像素信息,matlab代码如下:
close all;%关闭当前所有图形窗口
clear all;%清空工作空间变量
clc;%清屏
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图像默认位置,前两个
%数值是以主屏幕左下角为原点的窗口左下角坐标,后两个数值是宽和高
set(0,'defaultFigureColor',[1 1 1]);%修改图形背景颜色设置,共8种颜色可设置
h=imshow('hestain.png');%显示图像
hp=impixelinfo;%创建图像像素信息显示工具,拖动鼠标,显示所在位置及像素颜色
set(hp,'Position',[20 20 300 20]);%设置像素信息工具显示的位置,默认在左下角
figure
imshow('trees.tif');
impixelinfo %创建图像像素信息显示工具