1. 归一化
规划思路
归一化是将图画数据缩放到某个特定规模(通常是0到255)的进程,以便不同图画之间能够进行比较或进一步处理。
完成办法
- 找到图画中的最大和最小像素值。
- 运用最大和最小值将一切像素值线性缩放到0到255的规模内。
Matlab代码
function normalized_img = normalize_image(img)
% 将图画数据类型转换为double以进行核算
img_double = double(img);
% 归一化图画
normalized_img = (img_double - min(img_double(:))) / (max(img_double(:)) - min(img_double(:)));
end
作用
2. Gamma改换
规划思路
Gamma改换用于调整图画的亮度,经过非线性改换增强图画的暗部或亮部细节。
完成办法
- 对图画的每个像素值运用Gamma改换公式:O=I^,其中I是输入像素值,O是输出像素值,是Gamma值。
Matlab代码
function gamma_corrected_img = gamma_correction(img, gamma)
% 将图画转换为double类型
img_double = double(img) / 255;
% 运用gamma改换
gamma_corrected_img = img_double .^ gamma;
% 将成果缩放回原始的像素值规模
gamma_corrected_img = uint8(gamma_corrected_img * 255);
end
作用
3. 对数改换
规划思路
对数改换是一种增强图画中暗区域细节的办法,经过对每个像素值运用对数函数来完成。
完成办法
- 对图画的每个像素值运用对数改换公式:O=clog(1 I),其中I是输入像素值,O是输出像素值,c是常数。
Matlab代码
function log_transformed_img = log_transformation(img)
% 将图画转换为double类型
img_double = double(img);
% 运用对数改换
log_transformed_img = log(1 img_double);
% 将成果缩放到[0, 255]规模
log_transformed_img = uint8(255 * (log_transformed_img - min(log_transformed_img(:))) / (max(log_transformed_img(:)) - min(log_transformed_img(:))));
end
作用
4. 直方图全体均衡化
规划思路
直方图全体均衡化经过从头分配图画的像素值,使得直方图更加均匀,然后添加整个图画的对比度。
完成办法
- 核算图画的直方图和累积散布函数(CDF)。
- 运用CDF从头映射图画的像素值。
Matlab代码
function equalized_img = histogram_equalization(img)
% 遍历图画像素值,统计不同像素灰度值的占比
[m, n] = size(img);
hist = zeros(1, 256);
for i = 1:m
for j = 1:n
hist(img(i, j) 1) = hist(img(i, j) 1) 1;
end
end
hist = hist / (m * n);
% 核算累计散布函数
cdf = zeros(1, 256);
cdf(1) = hist(1);
for i = 2:256
cdf(i) = cdf(i - 1) hist(i);
end
% 将累计散布函数值映射到0-255之间
cdf = round(cdf * 255);
% 对图画进行直方图均衡化
equalized_img = uint8(zeros(m, n));
for i = 1:m
for j = 1:n
equalized_img(i, j) = cdf(img(i, j) 1);
end
end
end
作用
5. 直方图全体规定化
规划思路
直方图规定化(匹配)是将图画的直方图调整为契合特定散布(通常是另一张图画的直方图)的进程,用于图画增强和匹配。
完成办法
- 核算源图画和方针图画的直方图及其累积散布函数(CDF)。
- 运用源图画的CDF和方针图画的CDF之间的映射联系来调整源图画的像素值。
Matlab代码
function matched_img = histogram_matching(img, target_img)
% 核算原图画的累计散布函数
[om, on] = size(img);
ohist = zeros(1, 256);
for i = 1:om
for j = 1:on
ohist(img(i, j) 1) = ohist(img(i, j) 1) 1;
end
end
ohist = ohist / (om * on);
ocdf = zeros(1, 256);
ocdf(1) = ohist(1);
for i = 2:256
ocdf(i) = ocdf(i - 1) ohist(i);
end
% 核算方针图画的累计散布函数
[tm, tn] = size(target_img);
thist = zeros(1, 256);
for i = 1:tm
for j = 1:tn
thist(target_img(i, j) 1) = thist(target_img(i, j) 1) 1;
end
end
thist = thist / (tm * tn);
tcdf = zeros(1, 256);
tcdf(1) = thist(1);
for i = 2:256
tcdf(i) = tcdf(i - 1) thist(i);
end
% 核算原图画和方针图画的累计散布函数之间的映射联系
mapping = zeros(1, 256);
for i = 1:256
[~, index] = min(abs(ocdf(i) - tcdf));
mapping(i) = index - 1;
end
% 对原图画进行直方图匹配
matched_img = uint8(zeros(om, on));
for i = 1:om
for j = 1:on
matched_img(i, j) = mapping(img(i, j) 1);
end
end
end
作用
6. 直方图自适应均衡化
规划思路
直方图自适应均衡化(AHE)经过对图画的部分区域运用直方图均衡化来增强部分对比度,而不是整个图画。这能够带来更好的细节增强作用。为了完成AHE,图画被分割成多个32×32巨细的区块,每个区块独立进行直方图均衡化,然后将处理后的区块从头组合成完好的图画。
完成办法
- 将图画分割成32×32巨细的小块。
- 对每个小块独立进行直方图均衡化。
- 将均衡化后的小块从头组合成整个图画。
Matlab代码
function ahe_img = adaptive_histogram_equalization(img, tile_size)
% 获取图画的巨细
[rows, cols] = size(img);
% 初始化输出图画
ahe_img = zeros(size(img), 'uint8');
% 核算每个维度上的块数
num_tiles_row = ceil(rows / tile_size(1));
num_tiles_col = ceil(cols / tile_size(2));
% 循环处理每个块
for i = 1:num_tiles_row
for j = 1:num_tiles_col
% 核算当时块的鸿沟
row_start = (i-1) * tile_size(1) 1;
row_end = min(i * tile_size(1), rows);
col_start = (j-1) * tile_size(2) 1;
col_end = min(j * tile_size(2), cols);
% 提取当时块
tile = img(row_start:row_end, col_start:col_end);
% 对当时块运用直方图均衡化
eq_tile = histogram_equalization(tile);
% 将均衡化后的块放回输出图画
ahe_img(row_start:row_end, col_start:col_end) = eq_tile;
end
end
% 转换输出图画为uint8类型
ahe_img = uint8(ahe_img);
end
作用
7. 同一机位不同时刻拍照的两张图片,图画相减
规划思路
图画相减是一种简单的图画处理技能,用于突出两张图画之间的差异。这在监控和运动检测等范畴中非常有用。在这个试验中,从相同的摄像机位置拍照的两张不同时刻的图画被相减,以便观察变化。
完成办法
- 保证两张图画尺度相同。
- 将一张图画的像素值逐一减去另一张图画对应像素的值。
Matlab代码
function result = subtract_images(img1, img2)
% 保证两张图画是同一尺度
assert(all(size(img1) == size(img2)), 'Images must be the same size.');
% 将图画数据类型转换为double以进行核算
img1_double = double(img1);
img2_double = double(img2);
% 图画相减
result_double = img1_double - img2_double;
% 处理成果:取绝对值
result_double = abs(result_double); % 取绝对值
% 将成果归一化到0到255的规模内
result = uint8(255 * mat2gray(result_double));
end
作用
8. 对两个噪声图片相加求均匀
规划思路
将两个含有随机噪声的图画相加并求均匀,能够在必定程度上抵消噪声。这是图画去噪的根本办法之一,基于噪声的随机性和图画内容的一致性。
完成办法
- 将多张张含噪声的图画像素值相加。
- 将成果除以图片数目,得到均匀图画。
Matlab代码
function avg_img = average_images(img_array)
% 检查输入数组是否为空
assert(~isempty(img_array), 'The image array cannot be empty.');
% 获取第一张图画的尺度和数据类型作为参阅
[rows, cols, channels] = size(img_array{1});
img_type = class(img_array{1});
% 初始化用于累加图画的矩阵
sum_img = zeros(rows, cols, channels, 'double');
% 遍历图画数组,累加一切图画
for i = 1:length(img_array)
% 累加图画
sum_img = sum_img double(img_array{i});
end
% 核算均匀图画,并转换回原始图画的数据类型
avg_img = sum_img / length(img_array);
avg_img = cast(avg_img, 'like', img_array{1}); % 运用'like'参数坚持与原图画相同的数据类型
end
作用
9.进行3×3的均值滤波
规划思路
3×3的均值滤波是一种根本的图画平滑技能,经过将每个像素的值替换为其3×3邻域内像素值的均匀值来削减图画噪声。
完成办法
- 遍历图画中的每个像素。
- 对每个像素,核算其3×3邻域内像素的均匀值。
- 将核算出的均匀值赋给当时像素。
Matlab代码
function filtered_img = mean_filter_3x3(img)
[rows, cols] = size(img);
filtered_img = zeros(rows, cols, class(img));
% 遍历图画中的每个像素
for i = 2:rows-1
for j = 2:cols-1
% 提取3x3邻域
neighborhood = img(i-1:i 1, j-1:j 1);
% 核算邻域的均匀值
mean_value = sum(neighborhood(:)) / 9;
% 将均匀值赋给中心像素
filtered_img(i, j) = mean_value;
end
end
% 仿制边际像素
filtered_img(1,:) = img(1,:);
filtered_img(end,:) = img(end,:);
filtered_img(:,1) = img(:,1);
filtered_img(:,end) = img(:,end);
end
作用
10.进行5×5的高斯滤波(方差自行确认)
规划思路
5×5的高斯滤波运用高斯函数作为权重,对图画进行平滑处理。这种办法比均值滤波更加有效,由于它考虑了像素与邻域中心的间隔,更加重视中心像素的值。
完成办法
- 创立一个5×5的高斯核,核中的值由高斯函数决定。
- 将高斯核运用于图画的每个像素,核算加权均匀值。
- 将加权均匀值赋给当时像素。
Matlab代码
function filtered_img = gaussian_filter_5x5(img, sigma)
[rows, cols] = size(img);
filtered_img = zeros(rows, cols, class(img));
% 创立5x5高斯滤波器核
kernel_size = 5;
kernel = zeros(kernel_size, kernel_size);
for i = 1:kernel_size
for j = 1:kernel_size
x = i - ceil(kernel_size/2);
y = j - ceil(kernel_size/2);
kernel(i, j) = exp(-(x^2 y^2) / (2 * sigma^2));
end
end
kernel = kernel / sum(kernel(:)); % 归一化
% 遍历图画中的每个像素
for i = 3:rows-2
for j = 3:cols-2
% 提取5x5邻域
neighborhood = img(i-2:i 2, j-2:j 2);
% 核算邻域与高斯核的卷积
conv_value = sum(sum(double(neighborhood) .* kernel));
% 将卷积成果赋给中心像素
filtered_img(i, j) = conv_value;
end
end
% 仿制边际像素
filtered_img(1:2,:) = img(1:2,:);
filtered_img(end-1:end,:) = img(end-1:end,:);
filtered_img(:,1:2) = img(:,1:2);
filtered_img(:,end-1:end) = img(:,end-1:end);
end
作用