news 2026/1/19 6:20:25

基于Matlab GUI的图像处理之旅

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Matlab GUI的图像处理之旅

基于matlab GUI的图像处理,功能包括图像颜色处理(灰度图像、二值图像、反色变换、直方图、拉伸变换);像素操作(读取像素、修改像素)、平滑滤波(均值平滑、高斯平滑、中值平滑)、图像锐化(robert交叉梯度锐化、sobel梯度锐化、拉普拉斯锐化)、图像边缘检测(拉普拉斯算子、sobel算子、prewitt算子、roberts算子、canny算子)。 通过GUI以可视化的形式展现。 数据可更换自己的,程序已调通,可直接运行。

最近折腾了一个基于Matlab GUI的图像处理项目,感觉还挺有意思,跟大家分享分享。这个项目涵盖了多种图像处理功能,从图像颜色处理到像素操作,再到平滑滤波、图像锐化以及边缘检测,并且通过GUI以可视化的形式呈现出来,操作便捷,数据还能自己更换,程序已经调通,直接就能运行。

一、图像颜色处理

灰度图像

将彩色图像转换为灰度图像是图像处理中很基础的操作。在Matlab里实现起来也不难,看下面这段代码:

function grayImg = rgb2gray_custom(rgbImg) % 获取图像的尺寸 [rows, cols, ~] = size(rgbImg); % 初始化灰度图像 grayImg = zeros(rows, cols, 'uint8'); for i = 1:rows for j = 1:cols % 根据RGB转灰度的公式计算 grayImg(i, j) = 0.2989 * rgbImg(i, j, 1) + 0.5870 * rgbImg(i, j, 2) + 0.1140 * rgbImg(i, j, 3); end end end

这里我们通过手动遍历图像的每个像素,按照常见的RGB转灰度公式进行计算。当然,Matlab其实有自带的rgb2gray函数,不过自己实现一遍能更清楚原理嘛。

二值图像

二值图像只有黑白两种颜色,通常是根据一个阈值来将灰度图像进行转换。代码如下:

function binaryImg = gray2binary(grayImg, threshold) % 直接使用逻辑判断来生成二值图像 binaryImg = grayImg > threshold; % 将逻辑值转换为uint8类型 binaryImg = uint8(binaryImg) * 255; end

这里通过设定的阈值,大于阈值的像素设为白色(255),小于的设为黑色(0)。

反色变换

反色变换就是让图像颜色来个“颠倒”,代码如下:

function invertedImg = invertImage(grayImg) % 255减去原图像像素值 invertedImg = 255 - grayImg; end

就这么简单,一行代码搞定,把每个像素值从255中减去,颜色就反过来啦。

直方图

直方图能直观地展示图像中各灰度级的分布情况。Matlab里用imhist函数就可以轻松实现:

function plotHistogram(grayImg) imhist(grayImg); end

运行这个函数,就能弹出一个直方图窗口,看到图像灰度值的分布。

拉伸变换

拉伸变换可以增强图像的对比度,代码如下:

function stretchedImg = stretchImage(grayImg) % 获取图像的最小和最大灰度值 minVal = double(min(grayImg(:))); maxVal = double(max(grayImg(:))); % 进行拉伸变换 stretchedImg = uint8(255 * (double(grayImg) - minVal) / (maxVal - minVal)); end

先找到图像的最小和最大灰度值,然后按照公式把灰度值重新映射到0 - 255的范围,从而增强对比度。

二、像素操作

读取像素

读取像素就是获取图像某个位置的像素值,代码很简单:

function pixelVal = readPixel(grayImg, row, col) pixelVal = grayImg(row, col); end

给定图像和坐标,就能得到对应位置的像素值。

修改像素

修改像素就是对特定位置的像素值进行更改,代码如下:

function modifiedImg = modifyPixel(grayImg, row, col, newVal) % 复制原图像,避免直接修改原图像 modifiedImg = grayImg; modifiedImg(row, col) = newVal; end

这里先复制图像,再修改指定位置的像素值,防止误操作原图像。

三、平滑滤波

均值平滑

均值平滑就是用邻域像素的平均值来代替当前像素值,代码如下:

function smoothedImg = meanSmoothing(grayImg, windowSize) % 获取图像尺寸 [rows, cols] = size(grayImg); % 初始化平滑后的图像 smoothedImg = zeros(rows, cols, 'uint8'); % 计算窗口半径 radius = floor(windowSize / 2); for i = 1:rows for j = 1:cols sumVal = 0; count = 0; for x = max(1, i - radius):min(rows, i + radius) for y = max(1, j - radius):min(cols, j + radius) sumVal = sumVal + double(grayImg(x, y)); count = count + 1; end end smoothedImg(i, j) = uint8(sumVal / count); end end end

通过设定窗口大小,遍历窗口内的像素求和再平均,来平滑图像。

高斯平滑

高斯平滑利用高斯分布来对邻域像素加权平均,Matlab里可以用fspecial生成高斯核,再用imfilter进行滤波:

function gaussianSmoothedImg = gaussianSmoothing(grayImg, windowSize, sigma) % 生成高斯核 gaussianKernel = fspecial('gaussian', windowSize, sigma); % 进行滤波 gaussianSmoothedImg = imfilter(grayImg, gaussianKernel, 'replicate'); end

fspecial函数生成指定大小和标准差的高斯核,imfilter函数应用这个核到图像上。

中值平滑

中值平滑是用邻域像素的中值来代替当前像素值,代码如下:

function medianSmoothedImg = medianSmoothing(grayImg, windowSize) % 获取图像尺寸 [rows, cols] = size(grayImg); % 初始化平滑后的图像 medianSmoothedImg = zeros(rows, cols, 'uint8'); % 计算窗口半径 radius = floor(windowSize / 2); for i = 1:rows for j = 1:cols pixelVals = []; for x = max(1, i - radius):min(rows, i + radius) for y = max(1, j - radius):min(cols, j + radius) pixelVals = [pixelVals; double(grayImg(x, y))]; end end medianSmoothedImg(i, j) = uint8(median(pixelVals)); end end end

收集窗口内的像素值,取中值来替换当前像素值,达到平滑效果。

四、图像锐化

robert交叉梯度锐化

Robert交叉梯度锐化通过计算图像的梯度来增强边缘,代码如下:

function robertSharpenedImg = robertSharpening(grayImg) % 定义Robert交叉梯度算子 robertX = [-1, 0; 0, 1]; robertY = [0, -1; 1, 0]; % 计算X和Y方向的梯度 gradX = imfilter(double(grayImg), robertX, 'replicate'); gradY = imfilter(double(grayImg), robertY, 'replicate'); % 计算梯度幅值 gradMagnitude = sqrt(gradX.^2 + gradY.^2); % 归一化并转换为uint8类型 robertSharpenedImg = uint8(gradMagnitude / max(gradMagnitude(:)) * 255); end

通过定义算子,计算梯度幅值来锐化图像。

sobel梯度锐化

Sobel梯度锐化也是常用的方法,代码如下:

function sobelSharpenedImg = sobelSharpening(grayImg) % 定义Sobel算子 sobelX = [-1, 0, 1; -2, 0, 2; -1, 0, 1]; sobelY = [-1, -2, -1; 0, 0, 0; 1, 2, 1]; % 计算X和Y方向的梯度 gradX = imfilter(double(grayImg), sobelX, 'replicate'); gradY = imfilter(double(grayImg), sobelY, 'replicate'); % 计算梯度幅值 gradMagnitude = sqrt(gradX.^2 + gradY.^2); % 归一化并转换为uint8类型 sobelSharpenedImg = uint8(gradMagnitude / max(gradMagnitude(:)) * 255); end

和Robert类似,只是算子不同,通过计算梯度来锐化图像。

拉普拉斯锐化

拉普拉斯锐化通过增强图像的二阶导数来突出边缘,代码如下:

function laplacianSharpenedImg = laplacianSharpening(grayImg) % 定义拉普拉斯算子 laplacianKernel = [0, 1, 0; 1, -4, 1; 0, 1, 0]; % 计算拉普拉斯变换 laplacianImg = imfilter(double(grayImg), laplacianKernel, 'replicate'); % 锐化图像 laplacianSharpenedImg = grayImg - laplacianImg; % 限制像素值范围 laplacianSharpenedImg(laplacianSharpenedImg < 0) = 0; laplacianSharpenedImg(laplacianSharpenedImg > 255) = 255; laplacianSharpenedImg = uint8(laplacianSharpenedImg); end

先进行拉普拉斯变换,再通过原图像减去变换结果来锐化,最后限制像素值范围。

五、图像边缘检测

拉普拉斯算子

拉普拉斯算子检测边缘,代码如下:

function laplacianEdges = laplacianEdgeDetection(grayImg) % 定义拉普拉斯算子 laplacianKernel = [0, 1, 0; 1, -4, 1; 0, 1, 0]; % 计算拉普拉斯变换 laplacianImg = imfilter(double(grayImg), laplacianKernel, 'replicate'); % 取绝对值并归一化 laplacianEdges = abs(laplacianImg); laplacianEdges = uint8(laplacianEdges / max(laplacianEdges(:)) * 255); end

和拉普拉斯锐化类似,只是这里直接取绝对值并归一化来显示边缘。

sobel算子

Sobel算子检测边缘:

function sobelEdges = sobelEdgeDetection(grayImg) % 定义Sobel算子 sobelX = [-1, 0, 1; -2, 0, 2; -1, 0, 1]; sobelY = [-1, -2, -1; 0, 0, 0; 1, 2, 1]; % 计算X和Y方向的梯度 gradX = imfilter(double(grayImg), sobelX, 'replicate'); gradY = imfilter(double(grayImg), sobelY, 'replicate'); % 计算梯度幅值和方向 gradMagnitude = sqrt(gradX.^2 + gradY.^2); gradDirection = atan2(gradY, gradX); % 非极大值抑制 [rows, cols] = size(grayImg); sobelEdges = zeros(rows, cols, 'uint8'); for i = 2:rows - 1 for j = 2:cols - 1 angle = gradDirection(i, j) * 180 / pi; if (0 <= angle < 22.5) || (157.5 <= angle <= 180) q = gradMagnitude(i, j + 1); r = gradMagnitude(i, j - 1); elseif (22.5 <= angle < 67.5) q = gradMagnitude(i + 1, j - 1); r = gradMagnitude(i - 1, j + 1); elseif (67.5 <= angle < 112.5) q = gradMagnitude(i + 1, j); r = gradMagnitude(i - 1, j); elseif (112.5 <= angle < 157.5) q = gradMagnitude(i - 1, j - 1); r = gradMagnitude(i + 1, j + 1); end if (gradMagnitude(i, j) >= q) && (gradMagnitude(i, j) >= r) sobelEdges(i, j) = gradMagnitude(i, j); end end end % 双阈值处理 highThreshold = 0.5 * max(sobelEdges(:)); lowThreshold = 0.1 * highThreshold; for i = 1:rows for j = 1:cols if sobelEdges(i, j) > highThreshold sobelEdges(i, j) = 255; elseif sobelEdges(i, j) < lowThreshold sobelEdges(i, j) = 0; else if (sobelEdges(i - 1, j - 1) == 255) || (sobelEdges(i - 1, j) == 255) || (sobelEdges(i - 1, j + 1) == 255) ||... (sobelEdges(i, j - 1) == 255) || (sobelEdges(i, j + 1) == 255) ||... (sobelEdges(i + 1, j - 1) == 255) || (sobelEdges(i + 1, j) == 255) || (sobelEdges(i + 1, j + 1) == 255) sobelEdges(i, j) = 255; else sobelEdges(i, j) = 0; end end end end end

这里除了计算梯度幅值,还进行了非极大值抑制和双阈值处理来更好地检测边缘。

prewitt算子

Prewitt算子检测边缘:

function prewittEdges = prewittEdgeDetection(grayImg) % 定义Prewitt算子 prewittX = [-1, -1, -1; 0, 0, 0; 1, 1, 1]; prewittY = [-1, 0, 1; -1, 0, 1; -1, 0, 1]; % 计算X和Y方向的梯度 gradX = imfilter(double(grayImg), prewittX, 'replicate'); gradY = imfilter(double(grayImg), prewittY, 'replicate'); % 计算梯度幅值 gradMagnitude = sqrt(gradX.^2 + gradY.^2); % 归一化并转换为uint8类型 prewittEdges = uint8(gradMagnitude / max(gradMagnitude(:)) * 255); end

和Sobel类似,只是算子不同,通过计算梯度幅值检测边缘。

roberts算子

Roberts算子检测边缘:

function robertsEdges = robertsEdgeDetection(grayImg) % 定义Robert交叉梯度算子 robertX = [-1, 0; 0, 1]; robertY = [0, -1; 1, 0]; % 计算X和Y方向的梯度 gradX = imfilter(double(grayImg), robertX, 'replicate'); gradY = imfilter(double(grayImg), robertY, 'replicate'); % 计算梯度幅值 gradMagnitude = sqrt(gradX.^2 + gradY.^2); % 归一化并转换为uint8类型 robertsEdges = uint8(gradMagnitude / max(gradMagnitude(:)) * 255); end

和之前的Robert交叉梯度锐化计算梯度幅值类似,这里用来检测边缘。

canny算子

Canny算子是比较经典的边缘检测算法,Matlab里直接用edge函数就能实现:

function cannyEdges = cannyEdgeDetection(grayImg) cannyEdges = edge(grayImg, 'Canny'); cannyEdges = uint8(cannyEdges) * 255; end

简单一行代码,Matlab内部帮我们完成了复杂的Canny算法步骤,包括高斯平滑、梯度计算、非极大值抑制和双阈值处理等。

通过Matlab GUI把这些功能整合起来,用户可以方便地选择不同的处理方式,实时看到图像处理的效果。这样一个图像处理小工具,无论是对于图像处理的初学者,还是想快速实现

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/18 13:04:19

YOLOFuse项目根目录/root/YOLOFuse常见操作命令汇总

YOLOFuse项目根目录 /root/YOLOFuse 常见操作命令与技术实践 在智能安防、自动驾驶和全天候监控场景中&#xff0c;单一可见光图像检测常因低光照、雾霾或遮挡而失效。这时候&#xff0c;红外&#xff08;IR&#xff09;图像的优势就显现出来了——它不依赖环境光&#xff0c;…

作者头像 李华
网站建设 2026/1/17 14:27:13

YOLOFuse实战教程:如何在LLVIP数据集上进行多模态目标检测训练

YOLOFuse实战教程&#xff1a;如何在LLVIP数据集上进行多模态目标检测训练 在低光照、雾霾弥漫的夜晚&#xff0c;传统摄像头常常“睁眼瞎”&#xff0c;而红外热成像却能清晰捕捉人体与车辆的热辐射轮廓。这种互补特性催生了多模态目标检测技术——将可见光&#xff08;RGB&am…

作者头像 李华
网站建设 2026/1/17 20:42:52

YOLOFuse与科比特航空:电力巡检红外识别

YOLOFuse与科比特航空&#xff1a;电力巡检红外识别 在电网运维的深夜山岭间&#xff0c;一架搭载双光相机的无人机正低空飞行。浓雾弥漫&#xff0c;可见光画面几乎一片灰白——但红外图像中&#xff0c;一根高压线接头正泛着刺眼的橙红色热斑。几秒后&#xff0c;地面站系统弹…

作者头像 李华
网站建设 2026/1/18 13:04:13

YOLOFuse与大华股份集成:小区安防升级方案

YOLOFuse与大华股份集成&#xff1a;小区安防升级方案 在深夜的住宅小区里&#xff0c;监控室的值班人员盯着屏幕——画面中围墙角落一片漆黑&#xff0c;传统摄像头只能捕捉到模糊的树影晃动。突然&#xff0c;热成像画面中出现一个清晰的人形轮廓正翻越围栏。系统瞬间告警&am…

作者头像 李华
网站建设 2026/1/18 13:04:12

YOLOFuse量化压缩:INT8与FP16精度损失测试

YOLOFuse量化压缩&#xff1a;INT8与FP16精度损失测试 在智能安防、自动驾驶和夜间监控等现实场景中&#xff0c;单一可见光摄像头在低光照、烟雾遮挡或强逆光条件下常常“失明”。而红外成像不受光照影响&#xff0c;能捕捉人体热辐射特征——这正是多模态融合检测的价值所在。…

作者头像 李华
网站建设 2026/1/17 20:15:24

YOLOFuse知乎专栏运营:技术布道内容策划

YOLOFuse&#xff1a;让多模态目标检测真正“开箱即用” 在夜间监控中&#xff0c;可见光摄像头常常“失明”——漆黑的街道、模糊的人影、误报频发。而红外图像虽然能捕捉热辐射信息&#xff0c;却缺乏纹理细节&#xff0c;单独使用也难堪重任。这种两难局面正是当前智能感知…

作者头像 李华