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

作用

图画处理试验:噪声、滤波与直方图