Author:HanDi
上海某高校遥感专业 工科男
相信积微者速成,相信分享的力量
CSDN@这可真是难为我了
最近在学习matlab图像处理的内容。有些小练习就放在上面,复习自用。
最近学习编程,作为一个新手菜鸡,最深的感悟就是,一定要动手敲,切记不要以为自己懂了就ctrl c ctrl v,这样学习起来真的很难有收获。可以自己理解一遍后照着源码自己敲一遍(下面源码就是老师给的加上自己修改),最后要达到的效果就是脑中有思路,下手如有神~自己独立完成一个编程作业还是很有成就感的!
新手写技术博客没有什么经验,如有不足,还请大家多多包涵,欢迎大家私信交流 ^ _ ^ !!!一起进步~
以后会分享一些地理数据处理和数据挖掘的示例
下面是完整代码,我的matlab版本是 2021a
%此程序用于练习xls文件读写,中值滤波原理,最临近法插值原理,图像显示
clc
clear
[gray] = xlsread('image_gray.xlsx'); %读入excel数据
%gray = uint8(gray);
[height,weight] = size(gray); % 读取灰度图像矩阵的维度
%图像矩阵中随机引入高斯噪声
rng('default')
for i = 1:height
for j = 1:weight
gray(i,j) = gray(i,j) + randn;
if gray(i,j) > 255
gray(i,j) = 255;
end
if gray(i,j) <0
gray(i,j) = 0;
end
end
end
%进行中值滤波
result = zeros(height, weight); %生成的结果
prompt = '输入滤波模板尺寸(1到7之间的奇数): ';
x = input(prompt);
kernel_size = x; % 模板尺寸
expand_size = floor(kernel_size / 2); % 扩展尺寸
kernel = ones(kernel_size, kernel_size); %模板生成
expand_img = double(wextend('2D','zpd', gray, expand_size)); % 在原矩阵的外围填充0,使得中值模板运算后不改变图像大小
for i=1:height
for j=1:weight
mat = expand_img(i:i+kernel_size-1,j:j+kernel_size-1) .* kernel; %取出原矩阵中从(i,j)开始的n行n列元素与模板进行矩阵相乘
mat = mat(:); %展成一维数据
mat = sort(mat); %排序
if mod(kernel_size, 2)==1 %若为奇数 取排序后的中值
result(i,j) = mat((kernel_size*kernel_size+1)/2);
else % 为偶数 取排序后中间两数的均值
result(i,j) = (mat(kernel_size*kernel_size/2) + mat(kernel_size*kernel_size/2+1))/2;
end
end
end
%对图像矩阵进行最邻近插值 扩展为512x512大小
final_result = zeros(512, 512);
alpha_h = height / 512;
alpha_w = weight / 512;
for i = 1:512
for j = 1:512
src_x = round(i * alpha_h);
src_y = round(j * alpha_w);
final_result(i,j) = result(src_x, src_y);
end
end
%将double数据转化为uint8格式
final_result = uint8(final_result);
figure()
subplot(121)
imshow(gray,[]);axis on
title('原始图像')
subplot(122)
imshow(final_result);axis on
title('滤波并插值后512×512后的图像')
%写入excel文件
xlswrite('result.xlsx', final_result);
%存储jpg格式图像
imwrite(final_result,'result.jpg');
运行结果如上图