2026/5/21 14:43:39
网站建设
项目流程
泊头建网站,中文域名的网站,wordpress varnish,wordpress大气自媒体基于matlab GUI的图像处理#xff0c;功能包括图像颜色处理#xff08;灰度图像、二值图像、反色变换、直方图、拉伸变换#xff09;#xff1b;像素操作#xff08;读取像素、修改像素#xff09;、平滑滤波#xff08;均值平滑、高斯平滑、中值平滑#xff09;、图像…基于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); endfspecial函数生成指定大小和标准差的高斯核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把这些功能整合起来用户可以方便地选择不同的处理方式实时看到图像处理的效果。这样一个图像处理小工具无论是对于图像处理的初学者还是想快速实现