1.图像灰度变换。自选一张图片,完成以下图像处理:①显示图像的灰度直方图;②直方图均衡化,对比变化前后的图像和灰度直方图;③对图像进行线性灰度变换,对某部分灰度值进行扩展,压缩其它灰度值区域,对比变化前后的图像和灰度直方图。
图像增强: ·图像不清晰、不突出是由多种因素造成的, 如采集中未突出所需部分, 有干扰(噪声、散斑、运动模糊等等). ·目标是比原图像更适合于特定的应用, 便于识别和后继处理. ·不同的问题采用不同的方法, 评价结果好坏没有统一的标准. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
改善降质图像的方法: ·图像增强: 不考虑降质原因, 关心有用信息, 抑制次要部分, 去干扰, 增强对比度, 不一定要逼近原图像. ·复原技术: 针对降质原因, 设法补偿降质因素, 尽可能逼近原始图像, 恢复原图. 图像增强和复原技术有重叠部分. 增强带有恢复性质, 突出有用信息, 且是局部性恢复. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
图像灰度变换: ·按一定变换关系, 逐点改变原图像中每一个像素灰度值的方法. ·是图像增强处理技术中一种非常基础、直接的空间域图像处理方法. ·目的是为了改善画质, 使图像的显示效果更加清晰. 点运算: ·输入图像为f(x, y), 输出图像为g(x, y). ·点运算为g(x, y) = T[f(x, y)], 是一种像素的逐点运算. ·描述了输入和输出值之间的转换关系. ·不改变空间位置关系. ·点运算又称为”对比度增强”、”对比度拉伸”、”灰度变换”. 根据g(x, y) = T[f(x, y)], 可以将灰度变换分为线性变换和非线性变换. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
灰度线性变换: ·输出灰度级与输入灰度级呈线性关系的点运算. . ·如果a > 1, 输出图像的对比度增大. ·如果a < 1, 输出图像的对比度减小. ·如果a=1, b≠0, 使所有像素的灰度值上移或下移, 使整张图像更暗或更亮. ·如果a=1, b=0, 输出图像与输入图像相同. ·如果a < 0, 暗区域将变亮, 亮区域将变暗. 反转变换: g(x, y) = 255 - f(x, y). 分段线性变换: 有时为了保持f(x, y)灰度低端和高端值不变, 用下式 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
灰度非线性变换: ·输出灰度级与输入灰度级呈非线性关系的点运算. 灰度对数变换: ·对原图像的动态范围进行压缩. . 灰度指数运算: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
灰度直方图: 表示图像中具有某种灰度级的像素的个数, 它反映了图像中每种灰度出现的频率. 灰度直方图是图像最基本的统计特征. ·横坐标: 灰度级. ·纵坐标: 该灰度级出现的个数. 直方图效果图: ·四种基本图像类型, 暗、亮、低对比度和高对比度以及它们对应的直方图. ·从图像灰度级的分布可以看出一幅图像的灰度分布特性: a) 较暗; b) 偏亮. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
直方图的性质:
直方图计算: 在离散形式下, 用代表离散灰度级, 为图像中出现级灰度的像素数, 是图像像素总数, 为级灰度的像素的频数.
直方图均衡化: 经变换后得到的新直方图不是很平坦, 但比原始图像的直方图平坦的多, 扩展了动态范围. 对于对比度较弱的图像进行处理十分有效. 变换后的灰度级减少, 这种现象叫做”简并”现象. 由于简并现象的存在, 处理后的灰度级总是要减少的. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
以一个经典的例子掌握直方图均衡化的计算过程.
[注] 取整之后的值就是映射之后的坐标. 下面写出映射后的直方图.
|
1.1 显示图像的灰度直方图
- %gray histogram
- I = imread('Durant.png');
- %显示原图
- subplot(1, 3, 1);
- imshow(I);
- title('原始图像');
- %
- subplot(1, 3, 2);
- y = rgb2gray(I);
- imshow(y);
- title('灰度图');
- %
- subplot(1, 3, 3);
- imhist(y);
- title('gray histogram');
1.2 直方图均衡化
- %histogram equalization
- I = imread('Durant.png');
- %进行灰度变换
- I_gray = rgb2gray(I);
- %对图像I_gray进行直方图均衡化
- %直方图均衡通过转换灰度图像亮度值或索引图像的颜色图值来增强图像对比度,
- %输出图像的灰度直方图近似与给定的直方图相匹配.
- %J = histeq(I, N):
- %将灰度图像I转化成具有N个离散灰度级的灰度图像J, N缺省值为64.
- J = histeq(I_gray, 64);
- %显示I_gray
- subplot(1, 4, 1);
- imshow(I_gray);
- title('灰度图像');
- %
- subplot(1, 4, 2);
- imshow(J);
- title('均衡化后的灰度图像');
- %
- subplot(1, 4, 3);
- %imhist是MATLAB图像处理模块中的一个函数,
- %用于提取图像中的直方图信息.
- imhist(I_gray);
- title('灰度图像的直方图');
- %
- subplot(1, 4, 4);
- imhist(J);
- title('均衡化后的直方图');
(N=64)
(N=128)
(N=2)
1.3 线性灰度变换与分段线性灰度变换
1.3.1 线性灰度变换
- 线性灰度变换:
- %linear gray-scale transformation
- %
- I = imread('Durant.png');
- %
- I_gray = rgb2gray(I);
- %
- I_gray2 = I_gray - 50;
- I_gray3 = I_gray + 50;
- I_gray4 = I_gray * 0.5;
- I_gray5 = I_gray * 2.0;
- %
- subplot(1, 11, 1);
- imshow(I);
- title('原图');
- %
- subplot(1, 11, 2);
- imshow(I_gray);
- title('原图的灰度图');
- %
- subplot(1, 11, 3);
- imhist(I_gray);
- title('原图的灰度直方图');
- %
- subplot(1, 11, 4);
- imshow(I_gray2);
- title('Igray2 = Igray - 50');
- %
- subplot(1, 11, 5);
- imhist(I_gray2);
- %
- subplot(1, 11 ,6);
- imshow(I_gray3);
- title('Igray3 = Igray + 50');
- %
- subplot(1, 11, 7);
- imhist(I_gray3);
- %
- subplot(1, 11, 8);
- imshow(I_gray4);
- title('Igray4 = Igray * 0.5');
- %
- subplot(1, 11, 9);
- imhist(I_gray4);
- %
- subplot(1, 11, 10);
- imshow(I_gray5);
- title('Igray5 = Igray * 2.0');
- %
- subplot(1, 11, 11);
- imhist(I_gray5);
1.3.2 分段线性灰度变换
- %对图像进行分段线性变换
- %用底层算法实现
- image = imread('Durant.png');
- %rgb2gray是MATLAB内部一种处理图像的函数.
- %通过消除图像色调和饱和度信息, 同时保留亮度,
- %实现将RGB图像或彩色图像转换为灰度图像.
- %即灰度化处理.
- image_gray = rgb2gray(image);
- %image(:,:,1): 获取三维矩阵image中第一维、第二维的全部元素
- image_matrix = image_gray(:,:,1);
- %将image_matrix数组中的元素类型转换为double类型
- %image_matrix = double(image_matrix);
- %size(image):
- %将三维矩阵image的行数给height,
- %将.............的列数给width,
- %将...........的通道数给channels.
- [height, width, channels] = size(image_gray);
- %创建一个height×width的零矩阵
- G = zeros(height, width);
- %标定坐标点
- x1 = 40;
- x2 = 130;
- y1 = 50;
- y2 = 190;
- %创建一个1×255的零向量
- %灰度映射表, 灰度在0到255之间
- %注: f(0) = 0
- gray_map = zeros(1, 255);
- %计算灰度映射表
- %当x < x1时, 灰度变换函数为
- %f(x) = y1 / x1 * x
- for i = 1 : x1 - 1 %i从1到x1-1, 步长默认为1
- gray_map(i) = y1 * i / x1;
- end
- %当x1 ≤ x ≤ x2时, 灰度变换函数为
- %f(x) = (y2 - y1)*(x - x1) / (x2 - x1) + y1
- for i = x1 : x2 %i从x1到x2, 步长默认为1
- gray_map(i) = (y2 - y1) * (i - x1) / (x2 - x1) + y1;
- end
- %当x > x2时, 灰度变换函数为
- %f(x) = (255 - y2)*(x - x2) / (255 - x2) + y2
- for i = x2 + 1 : 255 %i从x2+1到255
- gray_map(i) = (255 - y2) * (i - x2) / (255 - x2) + y2;
- end
- %
- for i = 1 : height
- for j = 1 : width
- %遍历image_matrix矩阵的每一个元素
- T = image_matrix(i, j); %分析图片矩阵中坐标为(i, j)的元素
- if(T == 0)
- G(i, j) = 0;
- else
- G(i, j) = gray_map(T); %根据映射关系, 将映射后的值放入G矩阵中坐标(i ,j)的位置
- end
- end
- end
- %将G矩阵中的元素类型转换为uint8(0~255)
- image_out = uint8(G);
- %显示原图的灰度图像
- subplot(1, 4, 1);
- imshow(image_gray);
- title('原图的灰度图像');
- %显示原图(灰度图像)的直方图
- subplot(1, 4, 2);
- imhist(image_gray);
- title('原图灰度图像的直方图');
- %显示处理后的图像
- subplot(1, 4, 3);
- imshow(image_out);
- title('处理后的图像');
- %显示处理后(灰度图像)的直方图
- subplot(1, 4, 4);
- imhist(image_out);
- title('处理后的灰度直方图');