数字图像处理--(01)数字图像的基本操作(MATLAB)

本文作为本科系统学习数字图像处理的一个开篇吧,之前间断的学习了一些FPGA和matlab的相关知识,正逢校内开设这个课程,近期就更新下关于数字图像的知识吧,由于博主今年要准备考研,所以花在博客上的时间会比较少。

数字图像的操作

1.灰度或者二值转换为索引图像

gray2ind

将灰度或二进制图像转换为索引图像
[X,cmap] = gray2ind(I,c)
[X,cmap] = gray2ind(BW,c)
解释:
I— 灰度图像—数字数组
BW— 二进制图像—数字数组
c— 颜色图颜色的数量—正整数

下面把图像转换为128,64,16灰度级的索引图片

clc;
clear all;close all;
img=imread('../img1.jpg');
img=rgb2gray(img);
figure;
imshow(img);
title('original');
[x,map]=gray2ind(img,128);
figure;
imshow(x,map);
title('gray_128');
%%%%%%%%%%%重复操作%%%%%%%%%%%%%%
[x1,map1]=gray2ind(img,64);
figure;
imshow(x1,map1);
title('gray_64');
[x2,map2]=gray2ind(img,16);
figure;
imshow(x2,map2);
title('gray_16');

效果

在灰度级不断减小时,图片逐渐有失真的趋势
在这里插入图片描述

2.索引图像转换为灰度图像

ind2gray

I = ind2gray(X,cmap)
I = ind2gray(X,cmap) 将X带有颜色图 的索引图像转换cmap为灰度图像I。该 ind2gray功能在保持亮度的同时从输入图像中删除色相和饱和度信息。
X— 索引图像----数字数组
cmap— 颜色图----c-by-3数字数组

clc;
clear all;close all;
load trees
img = ind2gray(X,map);
figure,imshow(X,map);
title('orginal');
figure,imshow(img);
title('gray_image');

效果

在这里插入图片描述

3.RGB图像转换为灰度图像

rgb2gray

将 RGB 图像或颜色图转换为灰度图
语法:
I = rgb2gray(RGB)
newmap = rgb2gray(map)

clc;
clear all;close all;
img=imread('../img1.jpg');
gray=rgb2gray(img);
subplot(1,2,1);imshow(img);title('original');
subplot(1,2,2);imshow(gray);title('gray');

效果

在这里插入图片描述

4.RGB图像转换为索引图像

rgb2ind

rgb2ind函数对于减少RGB图像的颜色数是非常有用的。
将真彩色图像转换为索引图像。在matlab命令窗口中键入doc rgb2ind或help rgb2ind可以获得更多关于该函数的帮助信息。
该函数将真彩色图像转换为索引图像, 由于RGB图像一个像素占用三个字节, 分别存储R、G、B分量的值,而索引图像一个像素占用一个字节。在将灰度图像转换为索引图像时, 是从3个字节映射到一个字节的关系。 通常有以下三种算法:
gray = (R + G + B) / 3,即求得R、G、B三个分量平均值作为索引图像中对应像素点的像素值。
gray = min(R, G, B),即以R、G、B三个中最小分量作为索引图像对应像素点的像素值。
gray = 0.3 * R + 0.59 * G + 0.11 * B(或者表示为:gray = ((77 * R + 151 * G + 28 * B) >> 8))
调用格式:
[X,map] = rgb2ind(RGB, n)
使用第二种算法把真彩色图像转换为索引图像,其中n指定map中颜色项数, n最大不能超过65536。
返回值中map即索引图像的调色板。
X = rgb2ind(RGB, map)
使用调色板map将真彩色图像转换为索引图像,即在调色板中找到与真彩色图像颜色值最接近的颜色作为转换后的索引图像的像素值。map中颜色项数(即size(map, 1))不能超过65536。
[X,map] = rgb2ind(RGB, tol)
利用第一种算法把真彩色图像转换为索引图像, map中最多包含(floor(1/tol)+1)^3种颜色, tol必须是介于0.0和1.0之间的数。
[…] = rgb2ind(…, dither_option)

clc;
clear all;close all;
img=imread('../lena.jpg');
subplot(2,2,1);imshow(img);title('original');
[x,map]=rgb2ind(img,16);
subplot(2,2,2);imshow(x,map);title('最小方差量化抖动');
[x1,map1]=rgb2ind(img,0.5);
subplot(2,2,3);imshow(x,map);title('均值化抖动处理');
[x2,map2]=rgb2ind(img,16,'nodither');
subplot(2,2,4);imshow(x,map);title('不抖动');

效果

在这里插入图片描述

5.索引图像转换为RGB图像

ind2rgb

和ind2gray类似

clc;
clear all;close all;
load trees
img = ind2rgb(X,map);
figure,imshow(X,map);
title('orginal');
figure,imshow(img);
title('rgb_image');

在这里插入图片描述

6.通过阈值转换为二值图像

im2bw

im2bw使用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像。所谓二值图像, 一般意义上是指只有纯黑(0)、纯白(255)两种颜色的图像。 当然, 也可以是其他任意两种颜色的组合。
语法
BW = im2bw(I, level)
BW = im2bw(X, map, level)
BW = im2bw(RGB, level)
其中level就是设置阈值的。level取值范围[0, 1]

clc;
clear all;close all;
load trees
img = im2bw(X,map,0.3);
subplot(2,2,1);imshow(X,map);title('orginal');
subplot(2,2,2);imshow(img);title('bw_ind');
rgb=imread('../img1.jpg');
rgb_bw = im2bw(rgb,0.3);
subplot(2,2,3);imshow(rgb);title('orginal');
subplot(2,2,4);imshow(rgb_bw);title('bw_rgb');

效果

在这里插入图片描述

7.多级阈值化方法将灰度图像转换为索引图像

grayslice

语法:
X= grayslice(I,n);-----将亮度量化为n个等级,默认为64
X= grayslice(I,v);-----按阈值向量v对图像的亮度进行划分

clc;
clear all;close all;
img=imread('../img2.jpg');
subplot(2,2,1);imshow(img);title('original');
img1 = grayslice(img,64);
subplot(2,2,2);imshow(img1,jet(16));title('slices-64');
img2 = grayslice(img,128);
subplot(2,2,3);imshow(img,jet(128));title('slices-128');

效果

在这里插入图片描述

错误总结:
用matlab处理音频文件时候在命令行弹出提示,尝试将 SCRIPT script 作为函数执行

是因为编写的文件名和执行函数重名了。

例如我这里的sound.m和函数sound(y,fs)重名了,所以出错失败了

8.图像运算

代数运算是指对两幅输入图像进行点对点的加、减、乘或除运算而得到输出图像的运算。对于相加和相乘的情形,可能不止有两幅图像参加运算。在一般情况下,输入情况之一可能为常数。四种图像处理代数运算的数学表达式如下:
C(x,y)=A(x,y)+B(x,y)
C(x,y)=A(x,y)-B(x,y)
C(x,y)=A(x,y)*B(x,y)
C(x,y)=A(x,y)/B(x,y)

加操作

%利用imadd函数实现两幅图像的叠加
bw1=imread('../img2.jpg');
bw2=imread('../img1.jpg');
o_bw=imadd(bw1,bw2);
subplot(1,3,1);imshow(bw1);title('原始图像1');
subplot(1,3,2);imshow(bw2);title('原始图像2');
subplot(1,3,3);imshow(o_bw);title('两幅图叠加');

在这里插入图片描述

减操作

bw1=imread('../bw2.jpg');
bw2=imread('../bw1.jpg');
o_bw=imsubtract(bw1,bw2);
subplot(1,3,1);imshow(bw1);title('原始图像1');
subplot(1,3,2);imshow(bw2);title('原始图像2');
subplot(1,3,3);imshow(o_bw);title('输出');

在这里插入图片描述

乘操作

bw1=imread('../bw2.jpg');
bw2=imread('../bw1.jpg');
o_bw=immultiply(bw1,bw2);
subplot(1,3,1);imshow(bw1);title('原始图像1');
subplot(1,3,2);imshow(bw2);title('原始图像2');
subplot(1,3,3);imshow(o_bw);title('输出');

在这里插入图片描述

除操作

bw1=imread('../bw2.jpg');
bw2=imread('../bw1.jpg');
o_bw=imdivide(bw1,bw2);
subplot(1,3,1);imshow(bw1);title('原始图像1');
subplot(1,3,2);imshow(bw2);title('原始图像2');
subplot(1,3,3);imshow(o_bw);title('输出');

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/104609164
今日推荐