Unverified Commit ed05d1cf authored by Kiryuu Sakuya's avatar Kiryuu Sakuya 🎵
Browse files

Add 02

parent d620e7d6
# 图像基本运算
https://www.educoder.net/shixuns/ayiqgebf/challenges
## 01. 图像反转运算
### 任务描述
> *本任务所需的图片资源:img/breastxray.jpg
本关任务:编写 Matlab 代码片段,实现上述图片的反转运算,并分别显示变换前后的图片,以便观察。
### 相关知识
为了完成本关任务,你需要掌握:
1. 像素灰度量化的 Matlab 表示
2. 灰度反转变换的数学模型
#### 像素灰度量化的 Matlab 表示
数字图像标准的灰度量化范围为 0~255 的 8 位无符号整数,但在 Matlab 中有时需要将图像的灰度转换为 float 或 double 类型的数值,此时 Matlab 将自动将灰度量化为 0~1 之间的小数。
类型转换的Matlab函数为im2double(im);转换后的结果图像的灰度将自动转换为0~1间的数值。
```matlab
I=imread('img/breastxray.jpg');
Id=im2double(I);
```
#### 灰度反转变换
灰度反转变换的数学公式:
![灰度反转变换的数学公式.png](1.png)
反转变换示例如下:
```matlab
Idi=1-Id;
%或者
Idi=255-I
%或者
Ii=incomplenent(I);
```
### 编程要求
根据提示,在右侧编辑器补充代码,实现上述图片的反转运算,并分别显示变换前后的图片,图片资源:img/breastxray.jpg。
### 测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
The picture you output is exactly the same as the standard picture
---
开始你的任务吧,祝你成功!
### 答案
```matlab
I = imread('img/breastxray.jpg');
Id = im2double(I);
Idi = 1 - Id;
subplot(1, 2, 1);
imshow(I, []);
subplot(1, 2, 2);
imshow(Idi, []);
```
或者
```matlab
I = imread('img/breastxray.jpg');
subplot(1, 2, 1);
imshow(I, []);
subplot(1, 2, 2);
Fi = 255 - F;
imshow(Fi, []);
```
实际输出图片:
![output/picture1.jpg](output/picture1.jpg)
## 02. 图像线性变换
### 任务描述
本关任务:编写一个能根据输入图像灰度的最小值和最大值设计实现一个线性变换,将输入图像像素的灰度变换到 [128,255] 间。
> 本任务的测试图像资源:img/pollen512.tif
### 相关知识
为了完成本关任务,你需要掌握:
1. 如何获取图像灰度的两个极值
2. 如何根据(1)获取的极值构造相应的线性变换函数
#### 获取图像灰度的两个极值
图像灰度的最小值可用 Matlab 内置函数 min(I) 获得。
```matlab
I=imread('img/pollen512.tif');
%%灰度的最小值为gmin
Imin=min(I(:));
```
图像灰度的最大值可用 Matlab 内置函数 max(I) 获得。
```matlab
I=imread('img/pollen512.tif');
%%灰度的最小值为gmin
Imax=max(I(:));
```
#### 线性变换函数实现
首先,变换后图像的对比度为 255,根据对比度的定义:“图像灰度的最大值与最小值之差”。假设输入图像的灰度值范围为 [a,b],变换后的结果图像的灰度范围为 [c,d],则灰度变换可表达为:
![灰度变换](2.png)
现假设输入图像的灰度极值分别为 a=Imin, b=Imax,变换输出图像的灰度极值 c=0,d=255,则相应变换示例如下:
```matlab
I=imread('img/pollen512.tif');
NS=length(size(I));
if NS>2
I=rgb2gray(I);
end;
Imin=min(I(:));
Imax=max(I(:));
c=0;
d=255;
Il=(255-0)/(Imax-Imin).*(I-Imin);
figure(1);
imshow(Il,[]);
```
输出:
![3.png](3.png)
#### 如何将输入图像像素的灰度变换到 [128,255] 间
设输入图像的灰度极值分别为 a=Imin,b=Imax,根据任务要求,变换输出图像的灰度极值应该为:c=128,d=255,据此可构造出相应的线性变换函数,应用到图像上,即可实现变换。
### 编程要求
根据提示,在右侧编辑器补充代码,实现将输入图像像素的灰度变换到 [128,255] 间,并将变换结果可视化。
### 测试说明
平台会对你编写的代码进行测试:
测试输入:
预期输出:
![4.png](4.png)
---
开始你的任务吧,祝你成功!
### 答案
```matlab
I = imread('img/pollen512.tif');
Id = im2double(I);
Id1 = imadjust(I, stretchlim(I), [128/255, 1]);
imshow(Id1);
```
实际输出图片:
![output/picture2.jpg](output/picture2.jpg)
## 03. 图像非线性运算
### 任务描述
本关任务:实现对输入灰度图像进行非线性运算,实现图像增强处理。
1. 以 100 为底且 C=2 的对数运算
2. C=1,gamma=2 的指数运算
> 上述运算结果以 1 行 2 列子图的形式可视化运算结果。
>
> 图像资源:img/pollen512.tif
### 相关知识
为了完成本关任务,你需要掌握:
1. 非线运算分类
2. 如何实现图像的非线性运算
#### 非线运算分类
非线性运算可以按运算的实现方式,分为指数运算(Gamma运算)、对数运算两类。
##### 指数运算
![5.png](5.png)
![6.png](6.png)
##### 对数运算
![7.png](7.png)
![8.png](8.png)
#### 图像的非线性运算
##### 指数运算
示例如下:
```matlab
I=imread('img/pollen512.tif');
N=length(size(I));
if N>2
I=rgb2gray(I);
end;
I1=2.*log(1+I);
imshow(I1);
```
输出:
![9.png](9.png)
##### 对数运算
示例如下:
```matlab
I=imread('img/pollen512.tif');
N=length(size(I));
if N>2
I=rgb2gray(I);
end;
I1=I+eps).^0.2;
imshow(I1);
```
输出:
![10.png](10.png)
### 编程要求
根据提示,在右侧编辑器补充代码,完成上述的编程任务。
---
开始你的任务吧,祝你成功!
### 答案
第一个代码块:
```matlab
I = imread("img/pollen512.tif");
I = im2double(I);
subplot(1, 2, 1);
I1 = 2.*log(1 + I)./log(100);
imshow(I1, []);
```
第二个代码块:
```matlab
I2 = (I + eps).^2;
imshow(I2, []);
```
实际输出图片:
![output/picture3.jpg](output/picture3.jpg)
## 04. 直方图均衡运算
### 任务描述
本关任务:设计实现根据图像像素灰度的统计特征来完成图像相邻灰度差值的调整,实现基于灰度特征的图像增强运算。
### 相关知识
为了完成本关任务,你需要掌握:
1. 如何获取灰度统计特征
2. 如何实现基于统计特征的图像灰度变换
#### 图像读取与灰度转化
```matlab
I=imread('img/pollen512.tif');
N=ndims(I);
if N>2
I=rgb2gray(I);
end;
```
#### 获取灰度的统计特征
图像的灰度统计特征是指具有图像灰度值的像素的个数在整个灰度范围的统计结果规范总称。
假设灰度值为k,则图像I中具有灰度值K的像素个数,称为灰度k的频度:
![11.png](assets/11.png)
图像所有灰度的频度的集合,即可称为图像的统计特征。
如何计算图像的统计特征呢?
```matlab
h=zeros(256,1);
for i=0:255
h(i+1)=length(find(I==i));
end;
```
输出:
![12.png](assets/12.png)
特征规范化:
```matlab
h=h./numel(I);
figure,plot(0:255,h);
```
输出:
![13.png](assets/13.png)
#### 直方图均衡
通俗的理解,就是根据图像的每级灰度与相邻灰度的频度值动态调整它们的灰度差,最终使图像像素灰度分布于 0~255 间,以获得较好的图像感官质量。
如何实现直方图均衡呢?
1. 计算图像灰度的统计特征——统计直方图(详见获取灰度统计特征)
2. 计算其累积分布直方图
![14.png](assets/14.png)
累积直方图离散形式为:
![15.png](assets/15.png)
具体实现如下:
```matlab
H=h;
for i=2:256
H(i)=H(i)+H(i-1);
end;
figure,plot(0:255,H)
```
输出:
![16.png](assets/16.png)
#### 灰度均衡处理
```matlab
F=I;
for i=1:256
pos=find(I==(i-1));
F(pos)=H(i);
end;
figure,imshow(F);
```
输出:
![17.png](assets/17.png)
均衡后的图像直方图:
![18.png](assets/18.png)
### 编程要求
根据提示,在右侧编辑器补充代码,计算并完成基于灰度直方图的图像直方图均衡运算。
---
开始你的任务吧,祝你成功!
### 答案
```matlab
I = imread("img/pollen512.tif");
I = histeq(I);
imshow(I, []);
```
实际输出图片:
![output/picture4.jpg](output/picture4.jpg)
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment