clear all;
close all;
f=imread('C:\Users\刘航宇\Desktop\预实验\俯视图\背景.png'); %读取图像(用矩阵f表示)
u=rgb2gray(f); %将彩色图变成灰度图(用矩阵u表示)
F=double(f); %将彩色图序列变成双精度(用矩阵F表示),该双精度的数据类型是1到255的整数
U=double(u); %将灰度图序列变成双精度(用矩阵U表示),该双精度的数据类型是1到255的整数,相当于表示(i, j)处的亮度值,其随后用于Sobel算子运算
[H,W]=size(u); %提取图像横纵像素大小为H和W
uSobel=u;%定义一个与图像序列矩阵u相同的矩阵,随后其矩阵中每个元素用于储存相应(i,j)位置处Sobel算子的近似梯度值,该矩阵组成Sobel算子边缘检测得到的图像
double S;
double E;
double G;%用于转换uSobel(i,j)的值为双浮点精度数据类型
double g;%用于转换uSobel(i,j)的值为双浮点精度数据类型
G=0;
g=0;
S=0;%定义像素点梯度近似值之和初始值S=0
E=0;%定义梯度评价函数Tenengrad函数初始值E=0,定义为梯度的平方和
for i=2:H-1 %从(i=2) 排像素点开始直至(H-1) 进行Sobel算子运算
for j=2:W-1 %对第i排像素点从(j=2) 列像素点开始直至(W-1)逐个进行Sobel 算子运算% Gx和Gy分别表示横纵方向上对像素点∪(i, j)的亮度值差分值
Gx=(U(i+1,j-1)+2*U(i+1,j)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i-1,j)+F(i-1,j+1)); %横向(i,j)的亮度值差分值
Gy=(U(i-1,j+1)+2*U(i,j+1)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i,j-1)+F(i+1.j-1)); %纵向(i, j)的亮度值差分值
uSobel(i,j)=sqrt(Gx^2+Gy^2);%将点(i, j)处的梯度近似值储存在uSobel(i,j)
g=uSobel(i,j);
G=double(g);
S=S+G;
E=E+G^2;
end
end
S=S/(H*W);%S取所有像素点梯度近似值之和,按所有像素点数取平均值
E=E/(H*W);%E取所有像素点评价函数之和,按所有像素点数取平均值
subplot(1,2,1); %图划分为一行2幅图,绘制第1愊图即原图像
imshow(f);
title('原图');
subplot(1,2,2); %图划分为一行2幅图,绘制第2幅图即Sobel处理后的图像
imshow(im2uint8(uSobel));
title('Sobel处理后')
报错原因:索引下标问题?不是正整数?
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632