图像的点运算
所谓点运算,是指像素值(像素点的灰度值)通过运算之后,可以改善图像的显示效果。这是一种像素的逐点运算。
点运算又称为“对比度增强”、“对比度拉伸”,“灰度变换”(体现了点运算在哪些方面改变图片的显示效果)。
一.线性点运算
1.1 说明
1.2 示例
以lenna图像为例,点运算代码如下:
close all; clear all; I = imread('lenna.jpg'); I1 = 1.5 * I; %增强对比度 I2 = 0.8 * I; %减弱对比度 I3 = -1 * int8(I) + int8(255); %黑白反转 subplot(2, 2, 1), imshow(I), title('原始图像') subplot(2, 2, 2), imshow(I1), title('对比度增强') subplot(2, 2, 3), imshow(I2), title('对比度减弱') subplot(2, 2, 4), imshow(I3), title('黑白反转')
处理后的图像显示如下:
二.非线性点运算
2.1 说明
非线性点运算对应于非线性映射函数,典型的映射包括平方函数,对数函数,截取(窗口函数),阈值函数,多值量化函数等。
2.2 示例
- 阈值化处理
阈值化处理是最常用的一种非线性运算,它的功能是选择一阈值,将图像二值化,用于图像分割及边缘跟踪等处理。
代码如下:
close all; clear all; I = imread('lenna.jpg'); T = mean2(I); %设定初始阈值 done = false; while ~done G = I > T; Tnext = 0.5 * (mean(I(G)) + mean(I(~G))); done = abs(T - Tnext) < 0.5; T = Tnext; end G = im2bw(I, T/255); %根据确定的阈值进行图像二值分割 subplot(1, 2, 1), imshow(I), title('原始图像'); subplot(1, 2, 2), imshow(G), title('二值图像');
处理后的图像显示如下:
- 直方图均衡化
如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。
代码如下:
clear all; close all; I = imread('lenna.jpg'); subplot(2, 2, 1), imshow(I), title('原始图像'); subplot(2, 2, 2), imhist(I); G = histeq(I); % 灰度直方图的均衡化 subplot(2, 2, 3), imshow(G), title('直方图均衡化后图像'); subplot(2, 2, 4), imhist(G);
处理后的图像显示如下:
histeq的实现代码如下:
clear all; close all; I = imread('lenna.jpg'); I = im2double(I); [M, N] = size(I); [counts, x] = imhist(I); % counts:灰度值的个数,x:灰度值 location = find(counts ~= 0); % 找到所有像素个数不为0的灰度级位置 minCDF = min(counts(location)); % 找到像素数最少的灰度级 for i = 1 : length(location) CDF = sum(counts(location(1 : i))); % 计算各个灰度级像素的累计分布 P = find(I == x(location(i))); % 找到灰度级所在位置 I(P) =(CDF - minCDF) / (M * N - minCDF); % 灰度变换公式 end