Matlab数字图像处理核心项目实践:包含直方图均衡、空间过滤器增强、傅立叶变换与频域滤波、噪...
Matlab数字图像处理 包含以下内容 项目 1直方图均衡 项目 2使用空间过滤器增强图像 项目 3频域中的傅立叶变换和滤波 项目 4噪声模型和降噪 项目 5使用逆滤波器和维纳滤波器进行图像恢复 项目 6具有最近邻和双线性插值方法的几何变换 项目7基于离散余弦变换和小波变换的图像压缩 项目 8形态处理 项目 9边缘检测Roberts、Prewitt、Sobel、Marr-Hildreth 和 Canny 边缘检测器和图像分割Otsu 的方法 项目 10图像表示边界跟随和链码和主成分描述翻完旧硬盘里的10个数字图像处理大作业文件夹突然发现当年从只会点PS RGB滑块瞎调滤镜到能用Matlab写各种底层算子的过程挺像开冈萨雷斯同款盲盒——每个算子都是个小咒语试错起来比啃带满彩色插图还夹着折痕公式的厚书爽太多。先从第一个踩坑踩得最浅的“亮瞎眼暗戳戳变清晰”神器直方图均衡说起吧。一开始只会直接调用Matlab现成的histeq(I, 256)后来为了凑大作业的“工作量注水部分”别笑谁大作业没加过一两句自己编的碎碎念注释加个核心简化版手动步骤写了个只算256级灰度图的迷你版% 迷你版旧书扉页亮度修复器仅限无彩图旧照片当年穷买不起高清 I imread(1998年图书馆阿姨签名.jpg); if ndims(I) 3 I rgb2gray(I); end [M,N] size(I); counts imhist(I, 256); % 先数每个灰度有多少像素当年写成sum(Ik)循环过慢死 cdf cumsum(counts) / (M*N); % 攒概率当年冈萨雷斯说这是“累计分布函数的经验估计”完全听不懂就知道是把小的概率往上堆 new_gray uint8(round(cdf * 255)); % 当年纠结死四舍五入还是floorfloor试过签名太淡还是round顺眼 I_eq_min new_gray(I 1); % 像素值从0开始索引从1开始当年卡了半小时bug才发现 subplot(1,2,1); imshow(I); title(暗戳戳只有签名轮廓); subplot(1,2,2); imshow(I_eq_min); title(居然能看清“周三奶茶半价券忘给张同学”);当年对比那个张同学的奶茶券备注时差点叫出声——原来手动调PS根本救不了的东西攒点概率堆一堆就行。当然后来才知道histeq其实还有个小尾巴能控制直方图的形状比如用histeq(I,hgram)匹配目标直方图当年嫌麻烦没加错过了满分。接下来的空间滤波项目解锁了一堆PS滤镜的“真容”原来“高斯模糊”不是随便糊是用一个中间亮四周暗的高斯核卷一卷原来“锐化过度变狗啃”是拉普拉斯算子的阈值没设好原来边缘检测的简单版居然就是用Roberts的两个2x2小核或者Prewitt/Sobel的3x3大核上下左右差一差像素值。当年最开心的是把图书馆阿姨签名的旧照片再锐化一下备注的字体居然能隐约辨认正楷还是行草% 行草还是正楷锐化拉满试试 I_eq histeq(I); % 这次直接用现成的histeq偷懒 sobel_y fspecial(sobel); % 竖边检测核 sobel_x sobel_y; % 横边检测核当年转置这个小技巧省了好多打字 I_sobel_x imfilter(I_eq, sobel_x, replicate); % 边缘补全选replicate当年试symmetric/circular选circular签名居然和照片边缘连起来了像个蜘蛛网 I_sobel_y imfilter(I_eq, sobel_y, replicate); I_sobel sqrt(double(I_sobel_x).^2 double(I_sobel_y).^2); % 算梯度模长当年直接abs相加过模长还是更清晰一点 I_sobel uint8(255 * mat2gray(I_sobel)); % 归一化到0-255当年忘归一化显示出来全是黑的以为算子坏了 subplot(1,3,1); imshow(I_eq); title(均衡后); subplot(1,3,2); imshow(I_sobel); title(模长锐化后备注正楷);当年老师批作业的时候在备注正楷旁边画了个笑脸说“观察得很仔细下次记得给拉普拉斯也设个阈值试试不然狗啃得厉害”。说到阈值后面的Otsu分割就是自动找这个“最佳狗啃阈值”的神器当年第一次用Otsu的时候简直惊为天人原来不用手动调imtool的滑动条Matlab自动算出来的阈值就能把旧照片的签名从背景里抠出来。抠出来的签名还能用后面学的形态处理腐蚀膨胀开运算闭运算修一修毛边比如先开运算先腐蚀后膨胀去掉小毛点再闭运算先膨胀后腐蚀连起来断掉的笔画% 自动抠签名修毛边一条龙 level graythresh(I_eq); % Otsu算阈值当年写成level0.5二分过签名连背景糊成一团 I_binary imbinarize(I_eq, level); se strel(disk, 2); % 选半径2的圆盘形结构元素当年选正方形修毛边修得太狠备注的“三”变成了“一” I_open imopen(I_binary, se); I_close imclose(I_open, se); % 一条龙完成 subplot(1,3,1); imshow(I_binary); title(Otsu自动二分有小毛点和断笔画); subplot(1,3,2); imshow(I_open); title(开运算后毛点没了但断笔画更明显); subplot(1,3,3); imshow(I_close); title(闭运算后毛点没了断笔画连了);抠出来的签名还能用后面学的边界跟随和链码存成一串数字当年存成了一个txt文件发给同学炫耀同学说“一串数字看不懂但知道你这作业做了挺多东西”。Matlab数字图像处理 包含以下内容 项目 1直方图均衡 项目 2使用空间过滤器增强图像 项目 3频域中的傅立叶变换和滤波 项目 4噪声模型和降噪 项目 5使用逆滤波器和维纳滤波器进行图像恢复 项目 6具有最近邻和双线性插值方法的几何变换 项目7基于离散余弦变换和小波变换的图像压缩 项目 8形态处理 项目 9边缘检测Roberts、Prewitt、Sobel、Marr-Hildreth 和 Canny 边缘检测器和图像分割Otsu 的方法 项目 10图像表示边界跟随和链码和主成分描述炫耀完边界链码接下来就是傅里叶变换和频域滤波的“玄学项目”了当年第一次算fft2的时候直接imshow出来全是黑的后来才知道要fftshift把直流分量移到中间还要用log(1abs(F))压缩动态范围% 玄学傅里叶把模糊旧照片变不模糊试试其实先加了个运动模糊 I rgb2gray(imread(张同学大头贴.jpg)); PSF fspecial(motion, 20, 45); % 加个45度20像素的运动模糊当年大头贴手抖拍的就是这个效果 I_blur imfilter(I, PSF, conv, circular); % 选circular卷积避免边缘黑边虽然频域本来就是circular的 F_blur fft2(I_blur); F_blur_shift fftshift(F_blur); S_blur log(1 abs(F_blur_shift)); % 压缩动态范围当年直接imshow abs(F_blur_shift)只有中间一个亮点 subplot(1,2,1); imshow(I_blur); title(45度手抖模糊大头贴); subplot(1,2,2); imshow(S_blur, []); title(傅里叶频谱中间亮四周有45度的模糊条纹);当年看到四周的45度模糊条纹时终于相信傅里叶变换不是玄学了——原来空间域的模糊在频域就是特定方向的条纹。接下来用逆滤波和维纳滤波恢复逆滤波当年没加噪声还好一加高斯椒盐混合噪声直接变成雪花屏维纳滤波就稳多了能自动平衡逆滤波的噪声放大和模糊去除% 雪花屏还是清晰大头贴维纳滤波选后者 I_noise_blur imnoise(I_blur, gaussian, 0, 0.001) imnoise(I_blur, salt pepper, 0.02); % 加混合噪声当年只加高斯维纳滤波和逆滤波差别不大 % 逆滤波不加噪声专用加了就死 F_inv F_blur_shift ./ fftshift(fft2(PSF, M, N)); I_inv real(ifft2(ifftshift(F_inv))); % 维纳滤波加了也不怕 K 0.01; % 信噪比倒数的估计当年调了好久KK0.01刚好 F_wiener F_blur_shift .* conj(fftshift(fft2(PSF, M, N))) ./ (abs(fftshift(fft2(PSF, M, N))).^2 K); I_wiener real(ifft2(ifftshift(F_wiener))); subplot(1,3,1); imshow(I_noise_blur, []); title(混合噪声模糊大头贴); subplot(1,3,2); imshow(I_inv, []); title(逆滤波雪花屏张同学变成马赛克); subplot(1,3,3); imshow(I_wiener, []); title(维纳滤波张同学又回来了);当年老师批作业的时候在K0.01旁边画了个星星说“信噪比倒数估计得很准下次记得用Matlab现成的deconvwnr函数里面有自动估K的选项”。说到现成的函数后面的几何变换最近邻和双线性插值Matlab也有imresize和imrotate但当年为了凑大作业又写了个迷你版的图像放大2倍% 迷你版2倍放大器最近邻狗啃vs双线性顺滑 I imread(签名.jpg); [M,N] size(I); M_new 2*M; N_new 2*N; % 最近邻插值 I_nearest uint8(zeros(M_new, N_new)); for i 1:M_new for j 1:N_new x round(i/2); y round(j/2); if x 1; x 1; end; if x M; x M; end; % 边界补全 if y 1; y 1; end; if y N; y N; end; I_nearest(i,j) I(x,y); end end % 双线性插值写得很丑当年凑数的核心就是取周围四个像素加权平均 I_bilinear uint8(zeros(M_new, N_new)); for i 1:M_new for j 1:N_new x (i-0.5)/2; % 坐标转换当年卡了好久原来最近邻用的是i/2双线性用的是(i-0.5)/2更合理 y (j-0.5)/2; x1 floor(x); x2 x1 1; y1 floor(y); y2 y1 1; if x1 1; x1 1; end; if x2 M; x2 M; end; if y1 1; y1 1; end; if y2 N; y2 N; end; dx x - x1; dy y - y1; I_bilinear(i,j) (1-dx)*(1-dy)*double(I(x1,y1)) dx*(1-dy)*double(I(x2,y1)) (1-dx)*dy*double(I(x1,y2)) dx*dy*double(I(x2,y2)); end end subplot(1,3,1); imshow(I); title(原图签名); subplot(1,3,2); imshow(I_nearest); title(最近邻2倍狗啃签名); subplot(1,3,3); imshow(I_bilinear); title(双线性2倍顺滑签名);当年写双线性插值的循环写了好久运行起来也慢死当年的电脑还是酷睿i3后来才知道用Matlab的矩阵运算代替循环会快很多但当年凑数凑够了就行。最后剩下的就是图像压缩DCT和小波变换和边缘检测的进阶版Marr-Hildreth和Canny还有主成分描述了。图像压缩当年做的是把张同学的大头贴用DCT压缩去掉高频分量也就是细节只保留低频分量也就是轮廓和颜色压缩比居然能达到10:1还能看清张同学的脸% 迷你版DCT压缩器10:1压缩比试试 I rgb2gray(imread(张同学大头贴.jpg)); I im2double(I); T dctmtx(8); % 8x8 DCT变换矩阵 DCT_block (block) T * block.data * T; % 块DCT变换 IDCT_block (block) T * block.data * T; % 块IDCT变换 I_dct blockproc(I, [8 8], DCT_block); % 只保留左上角1/10的低频分量大概前3x3的块不对前1x1不当年保留的是每个8x8块的前k行前k列k3压缩比大概(3*3)/(8*8)14.2%接近10:1 mask zeros(8,8); mask(1:3,1:3) 1; Mask_block (block) block.data .* mask; I_dct_mask blockproc(I_dct, [8 8], Mask_block); I_idct blockproc(I_dct_mask, [8 8], IDCT_block); I_idct im2uint8(I_idct); subplot(1,2,1); imshow(I); title(原图大头贴); subplot(1,2,2); imshow(I_idct); title(10:1左右DCT压缩后能看清脸细节丢了一点);当年老师批作业的时候说“压缩比算得不对要把量化和熵编码也算进去但凑数凑够了及格没问题”。哦对了当年还差点忘了主成分描述主成分描述当年做的是把100张图书馆的旧照片的灰度图排成一个矩阵然后用PCA降维只保留前10个主成分居然能重建出大概的旧照片轮廓当年觉得太神奇了但代码太长就不放了。总的来说这10个数字图像处理大作业虽然当年凑数凑了很多踩坑踩了很多但现在回头看每个坑都是一个学习的机会每个凑数的代码都是一个加深理解的过程。当年只会点PS RGB滑块瞎调滤镜现在知道了每个滤镜背后的数学原理和Matlab小咒语这大概就是数字图像处理这门课的魅力所在吧。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2469792.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!