MATLAB GUI的多种数字图像处理(图像风格化)

favouryou 2024-07-01 11:35:04 阅读 83

摘  要

    本课程设计基于MATLAB GUI进行创建UI界面,并集成多种图像处理,包括图像模糊、图像锐化、BBHE直方图均衡化、图像素描、图像反色、图像浮雕、canny边缘检测、图像膨胀、图像腐蚀、图像油画功能,同时也给了保存图像的功能,经运行验证,UI界面可视化良好,图像处理所获得的结果均符合预期要求,并给出了图像处理算法的改进方向,可以提高图像处理效果。

关键词   MATLAB GUI 图像处理 图像油画

目录

摘  要... 2

1     引言... 4

2     图像处理整体UI介绍... 5

3     图像处理样式代码及原理分析... 6

2.1     复杂图像算法... 6

2.2     其他图像处理算法... 9

4     图像处理结果展示及分析... 12

5     UI及图像算法改进... 18

5.1     整体UI 18

5.2     图像油画效果改进... 18

5.3     素描画效果改进... 18

5.4     图像边缘检测改进... 18

结论... 19

参考文献... 20

附录(主体代码)... 21

引言

随着数字图像处理技术的不断发展,人们对图像处理工具的需求也日益增长。为了满足这一需求,我们开发了一款基于MATLAB GUI的图像处理软件。该软件集成了多种图像处理功能,包括图像模糊、图像锐化、BBHE直方图均衡化、图像素描、图像反色、图像浮雕、canny边缘检测、图像膨胀、图像腐蚀和图像油画,旨在为用户提供一个全面且易于使用的工具来处理他们的图像。

此外,我们还提供了保存图像的功能,使用户能够轻松地保存他们处理后的图像。经过运行验证,我们发现UI界面可视化良好,且图像处理所获得的结果均符合预期要求。

当然,我们也意识到仍有改进空间。在未来,我们将继续探索如何改进图像处理算法,以提高图像处理效果。总之,本课程设计为用户提供了一个强大且易于使用的图像处理工具,并为未来的改进奠定了基础。利用MATLAB软件的强大的矩阵计算功能和丰富实用的函数库,实现对图像的数字处理。

利用MATLAB GUI向导设计控件,提供用户多种图形对象和交互方式,减少了繁冗复杂的代码编译,使得编程的可视化和仿真分析更直观、便捷。

遵循简单性、一致性和习常性的设计原则,使得界面清晰、美观和易于使用。

涵盖多种图像处理算法和功能模块,支持多种图像数据格式和文件格式,展现了数字图像处理的效果和应用[1]。

本文将介绍该程序的设计思路、功能模块、实现方法和运行效果,以及遇到的问题和解决方案。

图像处理整体UI介绍

       本课程设计基于MATALB GUI 创建界面,其初始化页面如下图,完成的功能由选择处理图像和保存处理后的图像,可进行的操作有图像模糊、图像锐化、图像BBHE直方图均衡化、图像素描画、图像反色、图像雾化、图像浮雕样式、图像边缘检测、图像膨胀、图像腐蚀、图像油画和图像动漫化图像处理。

图 2—1 初始化页面

整体GUI处理流程如下图:

图 2—2 GUI 原理图

通过创建UI界面,定义UI内容,然后分别定义图像函数,通过按钮进行回调图像处理的函数,即完成任务。

图像处理样式代码及原理分析

复杂图像算法

BBHE直方图均衡化

这段MATLAB代码实现的是双边直方图均衡化(BBHE)算法,它是直方图均衡化算法的一种改进方法,可以提高图像对比度和视觉效果。

该算法的原理如下:

图 3—1 BBHE算法原理图

function junhengimage = junhengImage(image)

    I = image; % 读取图像

    Ir = I(:, :, 1); % 提取红色分量

    Ig = I(:, :, 2); % 提取绿色分量

    Ib = I(:, :, 3); % 提取蓝色分量

    % 调用 BBHE() 进行各分量图像增强

    I1 = BBHE(Ir);

    I2 = BBHE(Ig);

    I3 = BBHE(Ib);

    In = cat(3, I1, I2, I3); % 构造多维数组

    junhengimage = In; % 返回增强后的图像

    function A = BBHE(I)

        Xm = floor(mean2(I)); % 求图像灰度均值 Xm

        Xmin = min(I(:)); % 最小灰度值

        Xmax = max(I(:)); % 最大灰度值

        [m, n] = size(I); % 获取图像大小

        nl = sum(I(:) <= Xm); % 统计小于等于平均值的各级灰度值数量

        nu = sum(I(:) > Xm); % 统计大于平均值的各级灰度值数量

        Xl = histcounts(I(I <= Xm), Xmin:Xm+1);

        Xu = histcounts(I(I > Xm), Xm:Xmax+1); % 使用 histcounts 函数进行迭代统计

        Pl = Xl ./ nl;  % 记录对应各级灰度值的概率密度

        Pu = Xu ./ nu;

        Cl = cumsum(Pl); % 累计密度函数

        Cu = cumsum(Pu);

        fl = double(Xmin) + Cl .* (double(Xm) - double(Xmin));

        fu = double(Xm + 1) + Cu .* (double(Xmax) - double(Xm + 1));

        I_equal = I;

        lower_indices = I <= Xm;

        higher_indices = I > Xm;

        I_equal(lower_indices) = fl(I(lower_indices) - Xmin + 1);

        I_equal(higher_indices) = fu(I(higher_indices) - (Xm + 1) + 1);

        A = I_equal; % 返回均衡化后的灰度图像

    end

end

油画函数原理及代码

图 3—2 油画原理

上述原理图清晰得解释了油画生成的原理,利用像素点周围灰度值出现次数最多的像素点灰度值代替当前位置的灰度值实现油画效果[2]。

function youhuaImage = youhua(image, brushSize, intensity)

    [width, height, ~] = size(image);

    youhuaImage = uint8(zeros(width, height, 3));

    grayImage = rgb2gray(image);

    intensityLevel = 180;

    scaledImage = floor(double(grayImage) * (intensityLevel / 255)); % 缩放灰度图像的像

    for x = 1:width % 遍历图像的每个像素点

        for y = 1:height

            intensityCounter = zeros(1, intensityLevel + 1);

            colorR = zeros(1, intensityLevel + 1);

            colorG = zeros(1, intensityLevel + 1);

            colorB = zeros(1, intensityLevel + 1);

            for i = (x - brushSize):(x + brushSize) % 遍历当前像素点的邻域

                for j = (y - brushSize):(y + brushSize)% 检查邻域内的像素是否在图像范围内

                    if i > 0 && i <= width && j > 0 && j <= height  % 获取当前像素的灰度

                        intensity = scaledImage(i, j) + 1;% 更新计数器和颜色向量

                        intensityCounter(intensity) = intensityCounter(intensity) + 1;

                        colorR(intensity) = image(i, j, 1);

                        colorG(intensity) = image(i, j, 2);

                        colorB(intensity) = image(i, j, 3);

                    end

                end

            end

            [~, index] = max(intensityCounter);  % 找到出现次数最多的灰度值

            youhuaImage(x, y, 1) = colorR(index); % 更新输出图像的像素值

            youhuaImage(x, y, 2) = colorG(index);

            youhuaImage(x, y, 3) = colorB(index);

        end

    end

end

图像素描画原理及代码

图 3—3 素描画原理图

这个函数使用高斯滤波器对输入图像进行模糊处理,然后计算输入图像和模糊后的图像的差值,并将差值图像转换为二值图像,从而产生类似素描的效果[3]。

function sumiaoImage = sumiaoImage(image)

    image = double(image) / 255; %并归一化

    imageCopy = image; % 创建一个与输入图像相同的副本

    halfSize = 20; % 定义高斯滤波器的尺寸和标准差

    filterSize = 2 * halfSize + 1;

    sigma = filterSize / 6;

    gaussianFilter = fspecial('gaussian', filterSize, sigma);

filteredImage = imfilter(imageCopy, gaussianFilter, 'conv');

imageDiff = image - filteredImage; % 计算输入图像和模糊后的图像的差值

    imageOut = imageDiff + 0.5; % 将差值图像偏移0.5

    result = im2bw(imageOut, 0.48); % 将偏移后的图像转换为二值图像

    r = im2double(result);

    g = im2double(result);

    b = im2double(result);

    sumiaoImage = cat(3, r, g, b);

end

其他图像处理算法

图像动漫化

使用 imbilatfilt函数对图像进行双边滤波,以平滑图像的颜色。使用 `edge` 函数对图像进行边缘提取,得到一个二值图像。最后,将双边滤波后的图像与边缘图像进行合并,得到动漫化后的图像。

% 图像动漫化函数

function dongmanImage = dongmanImage(image)

    dongmanImage = imbilatfilt(image,100,20); %双边滤波

    ed_img = 1-edge((rgb2gray(image)),'canny',[0.07,0.1]); %边缘提取

    dongmanImage  = dongmanImage .*(uint8(repmat(ed_img,[1,1,3]))); %合并

end

Canny边缘检测

先将图像进行灰度化,然后调用内置edge函数对图像进行canny边缘检测

    % 图像边缘检测函数

    function edgeImage = Edge(image)

        grayscaleImage = rgb2gray(image);

        edgeImage = edge(grayscaleImage, 'Canny');

    end

图像模糊

调用内置fspecial高斯滤波器函数对图像加高斯模糊

% 图像模糊函数

    function mohuImage = mohuImage(image, radius)

        h = fspecial('disk', radius);

        mohuImage = imfilter(image, h, 'replicate');

    end

图像锐化

使用 imgaussfilt 函数对输入图像进行高斯模糊处理。这一步是为了去除图像中的噪声和细节然后计算输入图像和模糊后的图像的差值,并将差值乘以一个系数。这个系数由函数的第二个参数amount指定,它控制锐化效果的强度。最后算法将乘以系数后的差值加到输入图像上,从而增强图像中颜色变化的对比度。

    % 图像锐化函数

    function ruihuaImage = ruihuaImage(image, amount)

        blurredImage = imgaussfilt(image, 2);

        mask = image - blurredImage;

        ruihuaImage = image + amount * mask;

        ruihuaImage = uint8(max(0, min(ruihuaImage, 255)));

    end

图像反色

用255-输入图像的每个像素值达到取反的目的。

% 图像反色函数

    function fanseImage = fanseImage(image)

        fanseImage = 255 - image;

    end

图像雾化

随机生成噪声直接叠加到输入图像上从而产生雾化图像

% 图像雾化函数

   function wuhuaImage = addwuhua(image, amount)

    noise = randn(size(image)) * 64;

    wuhuaImage = double(image) + amount * noise;

    wuhuaImage = uint8(max(0, min(wuhuaImage, 255)));

    end

图像浮雕样式

首先定义了一个浮雕滤波器3×3的卷积核,用于增加浮雕效果的强度和锐化效果。然后,使用imfilter 函数对图像进行卷积运算,得到浮雕后的图像。最后,将浮雕图像的亮度调整为原来的亮度加上 160。

 % 图像浮雕样式函数

 function fudiaoImage = fudiaoImage(image)

      filter = [0 1 0; 1 -4 1; 0 1 0];  % 增加浮雕滤波器的强度和锐化效果

    fudiaoImage = imfilter(image, filter, 'replicate', 'conv');

    fudiaoImage = uint8(fudiaoImage + 160); % 调整浮雕图像的亮度

end

图像膨胀

直接调用imdilate对图像进行膨胀

  % 图像膨胀函数

    function pengzhangImage = pengzhangImage(image)

        se = strel('disk', 5);

        pengzhangImage = imdilate(image, se);

    end

图像腐蚀

直接调用imerode对图像进行腐蚀操作

 % 图像腐蚀函数

    function fushiImage = fushiImage(image)

        se = strel('disk', 5);

        fushiImage = imerode(image, se);

    end

图像处理结果展示及分析

BBHE直方图均衡化

图 4—1  BBHE直方图均衡化

从效果图与原图对比分析,发现经过bbhe均衡化之后的图像,背景变亮,无什么噪点,较清晰的还原出背景,但整体色调较原图偏冷。

油画

图 4—2  油画效果

该油画效果函数,可以通过调整笔刷和强度对效果进行调整,上面效果图已经很好的将原图进行油画效果展示,若将笔刷调大,将会造成部分细节丢失。

素描

图 4—3 素描效果

如上图图像像素描画效果,对鲜花进行素描,已经较好的将鲜花的轮廓还原出来,但部分细节有些失真。

动漫

图 4—4 动漫效果

图像的动漫画效果表现良好,基本将图像动漫画的较为生动。

边缘检测

图 4—5  Canny边缘检测

由于在进行边缘化的过程中对图像进行了滤波去掉噪声,所以可能会造成细节丢失,从上图来看,效果表现良好。

模糊

图 4—6  模糊效果

可以通过调整噪声的大小对模糊度进行调整。

锐化

图 4—7  锐化效果

图像锐化的效果是为了对模糊的图像变得更加清晰,先讲原图进行模糊化,再进行锐化,从上图的效果来看基本满足需求,但整体来看噪点会增多。

反色

图 4—8反色效果

反色即从每个像素点的灰度值进行取反。

雾化

图 4—9 雾化效果

图像的雾化即从原图表面覆盖噪声,但从上面效果图来看,覆盖噪声之后效果一般,导致噪点增加,与传统雾化图有差距。

浮雕

图 4—10 浮雕效果

图像浮雕化的目的是为了使原图像产生一定的立体感,上图效果图能够较好的使原图产生一定的立体感。

膨胀

图 4—11 膨胀效果

图像膨胀是一种形态学运算,它的目的是将目标图像扩大,运算效果取决于结构元素大小内容以及逻辑运算性质。它类似于“领域扩张”,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。上图效果反映了该原理。

腐蚀

图 4—12 腐蚀效果

图像腐蚀是一种形态学运算,它的目的是将目标图像收缩,运算效果取决于结构元素大小内容以及逻辑运算性质。它类似于“领域蚕食”,将图像的高亮部分被腐蚀,其运行结果图比原图的高亮区域更小。上图效果反映了该原理。

UI及图像算法改进

整体UI

整体UI较为简陋,可以将其进行优化,形成多功能菜单,也可以增加某些函数继续完善图像处理,对于某些函数可以增加一些滑动条对其中的变量进行调整,使效果图进行动态化展示效果的变化,具体可以参考文章[5]

图像油画效果改进

通过对不同的图片进行油画处理,发现对于色彩比较杂的图片,油画效果表现不佳,可以通过采用不同尺度的笔刷按照从粗到细的顺序逐层绘制。在每层笔刷绘制中,首先使用增量Voronoi序列采样点和图像切线方向场确定笔刷流线,然后结合笔刷形状与笔刷高度场进行纹理贴图,得到最终的图像油画风格化绘制结果。与现有算法比较,文中算法不仅能模拟真实的油画绘制过程,而且生成的油画效果层次感更强,充分体现了图像的结构特征和油画细节[4]。

素描画效果改进

首先对原始图像做去噪、增强等预处理,用微分算子提取多像素宽的轮廓线条;再通过膨胀和腐蚀处理并将结果相减生成多层双边轮廓线条,用运动模糊处理多层双边线条得到素描纹理;最后融合边缘和素描纹理,得到素描效果图像。通过对不同特点的图像进行实验,证明该方法得到的素描画的效果比较接近手绘风格[6]。

图像边缘检测改进

常见的边缘检测算子包括Sobel算子、Prewitt算子、Roberts算子、Canny算子和Marr-Hildreth算子等[7],都可以进行改进,同时还有关机用CNN神经网络进行边缘检测。

其他图像处理函数都可以进行改进,使效果更佳。

结论

本课程设计所展示的结果能够较好的完成UI提供的图像处理要求,同时结合多种图像处理算法集成与GUI上使图像处理操作更加简便,同时提供了保存处理之后的照片的功能,能够对多种图像处理进行简洁混用操作,极大的方便了对图像进行处理。

同时在本次课程设计中,学习到了GUI基础知识,做了一个简单的UI界面进行操作,对MATLAB的认识更加深入,也对数字图像处理常见的几种图像处理方法有了更深的了解,学习到了更多。

参考文献

https://zhuanlan.zhihu.com/p/398812239.http://t.csdn.cn/UgTie http://t.csdn.cn/1jZ9A 陈颖,荆树旭,石剑等.基于多尺度笔刷的分层油画风格化[J].计算机辅助设计与图形学学报,2020,32(04):575-581.https://blog.csdn.net/qq_42758098/article/details 李智慧,范铁生,唐春鸽等.具有层次素描纹理的素描画绘制方法[J].计算机应用,2012,32(10):2851-2854.

附录全部代码

function imageProcessingGUI()

% 创建GUI窗口

fig = figure('Name', '图像处理工具','Position', [200, 200, 1000, 500]);

% 创建轴并设置背景图像

% axesHandle = axes('Units', 'pixels', 'Position', [0, 0, 1000, 500]);

% backgroundImage = imread('背景.jpg'); % 替换为实际的背景图像文件

% imagesc(backgroundImage);

% set(axesHandle, 'Visible', 'off'); % 隐藏轴边框和刻度

% 创建个人创作信息文本标签

% infoText = uicontrol('Style', 'text', 'Position', [50, 450, 250, 20], 'HorizontalAlignment', 'left', 'String', ' 1', 'FontSize', 14);

% 创建按钮

mohuButton = uicontrol('Style', 'pushbutton', 'String', '图像模糊', 'Position', [50, 350, 100, 30], 'Callback', @processImage);

ruihuaButton = uicontrol('Style', 'pushbutton', 'String', '图像锐化', 'Position', [200, 350, 100, 30], 'Callback', @processImage);

fudiaoButton = uicontrol('Style', 'pushbutton', 'String', '图像浮雕样式', 'Position', [50, 300, 100, 30], 'Callback', @processImage);

sumiaoButton = uicontrol('Style', 'pushbutton', 'String', '图像素描', 'Position', [500, 350, 100, 30], 'Callback', @processImage);

fanseButton = uicontrol('Style', 'pushbutton', 'String', '图像反色', 'Position', [650, 350, 100, 30], 'Callback', @processImage);

wuhuaButton = uicontrol('Style', 'pushbutton', 'String', '图像雾化', 'Position', [800, 350, 100, 30], 'Callback', @processImage);

junhenButton = uicontrol('Style', 'pushbutton', 'String', 'BBHE直方图均衡化', 'Position', [350, 350, 100, 30], 'Callback', @processImage);

edgeButton = uicontrol('Style', 'pushbutton', 'String', 'canny边缘检测', 'Position', [200, 300, 100, 30], 'Callback', @processImage);

pengzhangButton = uicontrol('Style', 'pushbutton', 'String', '图像膨胀', 'Position', [350, 300, 100, 30], 'Callback', @processImage);

fushiButton = uicontrol('Style', 'pushbutton', 'String', '图像腐蚀', 'Position', [500, 300, 100, 30], 'Callback', @processImage);

youhuaButton = uicontrol('Style', 'pushbutton', 'String', '图像油画', 'Position', [650, 300, 100, 30], 'Callback', @processImage);

dongmanButton = uicontrol('Style', 'pushbutton', 'String', '图像动漫化', 'Position', [800, 300, 100, 30], 'Callback', @processImage);

% 创建保存图像按钮

saveButton = uicontrol('Style', 'pushbutton', 'String', '保存图像', 'Position', [200, 400, 100, 40], 'Callback', @saveImage);

selectButton = uicontrol('Style', 'pushbutton', 'String', '选择图像', 'Position', [50, 400, 100, 40], 'Callback', @selectImage);

% 选择的图像

image = [];

processedImage = [];

% 创建图像显示区域

axesHandle1 = axes('Units', 'pixels', 'Position', [50, 50, 300, 200],'Box', 'off');

axesHandle2 = axes('Units', 'pixels', 'Position', [550, 50, 300, 200],'Box', 'off');

axis(axesHandle1, 'off');

axis(axesHandle2, 'off');

% 创建方框

rectanglePosition1 = [0.1, 0.1, 0.2, 0.40]; % 根据需要调整方框的位置和大小

rectanglePosition2 = [0.6, 0.1, 0.2, 0.4]; % 根据需要调整方框的位置和大小

annotation('rectangle', 'Position', rectanglePosition1, 'Color', 'k', 'LineWidth', 2);

annotation('rectangle', 'Position', rectanglePosition2, 'Color', 'k', 'LineWidth', 2);

% 保存图像回调函数

function saveImage(~, ~)

if isempty(processedImage)

return;

end

[filename, path] = uiputfile({'*.jpg', 'JPEG 图像文件 (*.jpg)'; '*.png', 'PNG 图像文件 (*.png)'; '*.bmp', 'BMP 图像文件 (*.bmp)'}, '保存图像文件');

if isequal(filename, 0) || isequal(path, 0)

return;

end

savePath = fullfile(path, filename);

try

imwrite(processedImage, savePath);

msgbox('图像保存成功!', '保存成功');

catch

errordlg('保存图像失败!', '保存失败');

end

end

% 选择图像回调函数

function selectImage(~, ~)

% 选择要处理的图像

[filename, path] = uigetfile({'*.jpg;*.png;*.bmp', '图像文件 (*.jpg, *.png, *.bmp)'}, '选择图像文件');

if isequal(filename, 0) || isequal(path, 0)

return;

end

% 读取图像

image = imread(fullfile(path, filename));

% 显示原始图像

imshow(image, 'Parent', axesHandle1);

% title('原始图像');

end

% 图像处理回调函数

function processImage(source, ~)

% 获取按钮的标签

tag = source.String;

% 调用相应的图像处理函数

switch tag

case '图像模糊'

radius = 5; % 模糊半径

processedImage = mohuImage(image, radius);

case '图像锐化'

amount = 10; % 锐化程度

processedImage = ruihuaImage(image, amount);

case '图像浮雕样式'

processedImage = fudiaoImage(image);

case '图像素描'

processedImage = sumiaoImage(image);

case '图像反色'

processedImage = fanseImage(image);

case '图像雾化'

amount = 0.2; % 雾化程度

processedImage = addwuhua(image, amount);

case 'BBHE直方图均衡化'

processedImage = junhengImage(image);

case 'canny边缘检测'

processedImage = Edge(image);

case '图像膨胀'

processedImage = pengzhangImage(image);

case '图像腐蚀'

processedImage = fushiImage(image);

case '图像油画'

brushSize = 5; % 刷子尺寸

intensity = 1; % 油画强度

processedImage = youhua(image, brushSize, intensity);

case '图像动漫化'

processedImage = dongmanImage(image);

end

% 显示处理前的图像

axes(axesHandle1);

imshow(image);

title('原始图像');

% 显示处理后的图像

axes(axesHandle2);

imshow(processedImage);

title(axesHandle2, tag);

end

% 图像模糊函数

function mohuImage = mohuImage(image, radius)

h = fspecial('disk', radius);

mohuImage = imfilter(image, h, 'replicate');

end

% 图像锐化函数

function ruihuaImage = ruihuaImage(image, amount)

blurredImage = imgaussfilt(image, 2);

mask = image - blurredImage;

ruihuaImage = image + amount * mask;

ruihuaImage = uint8(max(0, min(ruihuaImage, 255)));

end

% 图像浮雕样式函数

function fudiaoImage = fudiaoImage(image)

% 增加浮雕滤波器的强度和锐化效果

filter = [0 1 0; 1 -4 1; 0 1 0];

fudiaoImage = imfilter(image, filter, 'replicate', 'conv');

fudiaoImage = uint8(fudiaoImage + 160); % 调整浮雕图像的亮度

end

function sumiaoImage = sumiaoImage(image)

image = double(image) / 255; %并归一化

imageCopy = image; % 创建一个与输入图像相同的副本

halfSize = 20; % 定义高斯滤波器的尺寸和标准差

filterSize = 2 * halfSize + 1;

sigma = filterSize / 6;

gaussianFilter = fspecial('gaussian', filterSize, sigma);

filteredImage = imfilter(imageCopy, gaussianFilter, 'conv'); % 使用高斯滤波器对图像进行模糊处理

imageDiff = image - filteredImage; % 计算输入图像和模糊后的图像的差值

imageOut = imageDiff + 0.5; % 将差值图像偏移0.5

result = im2bw(imageOut, 0.48); % 将偏移后的图像转换为二值图像

r = im2double(result);

g = im2double(result);

b = im2double(result);

sumiaoImage = cat(3, r, g, b);

end

% 图像反色函数

function fanseImage = fanseImage(image)

fanseImage = 255 - image;

end

% 图像雾化函数

function wuhuaImage = addwuhua(image, amount)

noise = randn(size(image)) * 64;

wuhuaImage = double(image) + amount * noise;

wuhuaImage = uint8(max(0, min(wuhuaImage, 255)));

end

function junhengimage = junhengImage(image)

I = image; % 读取图像

Ir = I(:, :, 1); % 提取红色分量

Ig = I(:, :, 2); % 提取绿色分量

Ib = I(:, :, 3); % 提取蓝色分量

% 调用 BBHE() 进行各分量图像增强

I1 = BBHE(Ir);

I2 = BBHE(Ig);

I3 = BBHE(Ib);

In = cat(3, I1, I2, I3); % 构造多维数组

junhengimage = In; % 返回增强后的图像

function A = BBHE(I)

Xm = floor(mean2(I)); % 求图像灰度均值 Xm

Xmin = min(I(:)); % 最小灰度值

Xmax = max(I(:)); % 最大灰度值

[m, n] = size(I); % 获取图像大小

nl = sum(I(:) <= Xm); % 统计小于等于平均值的各级灰度值数量

nu = sum(I(:) > Xm); % 统计大于平均值的各级灰度值数量

Xl = histcounts(I(I <= Xm), Xmin:Xm+1);

Xu = histcounts(I(I > Xm), Xm:Xmax+1); % 使用 histcounts 函数进行迭代统计

Pl = Xl ./ nl; % 记录对应各级灰度值的概率密度

Pu = Xu ./ nu;

Cl = cumsum(Pl); % 累计密度函数

Cu = cumsum(Pu);

fl = double(Xmin) + Cl .* (double(Xm) - double(Xmin));

fu = double(Xm + 1) + Cu .* (double(Xmax) - double(Xm + 1));

I_equal = I;

lower_indices = I <= Xm;

higher_indices = I > Xm;

I_equal(lower_indices) = fl(I(lower_indices) - Xmin + 1);

I_equal(higher_indices) = fu(I(higher_indices) - (Xm + 1) + 1);

A = I_equal; % 返回均衡化后的灰度图像

end

end

% 图像边缘检测函数

function edgeImage = Edge(image)

grayscaleImage = rgb2gray(image);

edgeImage = edge(grayscaleImage, 'Canny');

end

% 图像膨胀函数

function pengzhangImage = pengzhangImage(image)

se = strel('disk', 5);

pengzhangImage = imdilate(image, se);

end

% 图像腐蚀函数

function fushiImage = fushiImage(image)

se = strel('disk', 5);

fushiImage = imerode(image, se);

end

end

function youhuaImage = youhua(image, brushSize, intensity)

[width, height, ~] = size(image);

youhuaImage = uint8(zeros(width, height, 3));

grayImage = rgb2gray(image);

intensityLevel = 180;

scaledImage = floor(double(grayImage) * (intensityLevel / 255)); % 缩放灰度图像的像素

for x = 1:width % 遍历图像的每个像素点

for y = 1:height

intensityCounter = zeros(1, intensityLevel + 1);

colorR = zeros(1, intensityLevel + 1);

colorG = zeros(1, intensityLevel + 1);

colorB = zeros(1, intensityLevel + 1);

for i = (x - brushSize):(x + brushSize) % 遍历当前像素点的邻域

for j = (y - brushSize):(y + brushSize)% 检查邻域内的像素是否在图像范围内

if i > 0 && i <= width && j > 0 && j <= height % 获取当前像素的灰度值

intensity = scaledImage(i, j) + 1;% 更新计数器和颜色向量

intensityCounter(intensity) = intensityCounter(intensity) + 1;

colorR(intensity) = image(i, j, 1);

colorG(intensity) = image(i, j, 2);

colorB(intensity) = image(i, j, 3);

end

end

end

[~, index] = max(intensityCounter); % 找到出现次数最多的灰度值

youhuaImage(x, y, 1) = colorR(index); % 更新输出图像的像素值

youhuaImage(x, y, 2) = colorG(index);

youhuaImage(x, y, 3) = colorB(index);

end

end

end

% 图像动漫化函数

function dongmanImage = dongmanImage(image)

dongmanImage = imbilatfilt(image,100,20); %双边滤波

ed_img = 1-edge((rgb2gray(image)),'canny',[0.07,0.1]); %边缘提取

dongmanImage = dongmanImage .*(uint8(repmat(ed_img,[1,1,3]))); %合并

end



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。