用MATLAB和C++计算同一副图像的信息熵 结果却不一样

gwena 2017-04-14 10:44:48
我用MATLAB和C++计算同一副图像的信息熵 结果却不一样

MATLAB代码:

I=imread(path);
[C,R]=size(I); %求图像的规格,如果I是一个矩阵,返回行和列
H_img=0;
temp=zeros(1,256);
for c=1:C
for r=1:R
i=I(c,r)+1; %获取图像的灰度级
temp(i)=temp(i)+1; %统计每个灰度级像素的点数
end
end
for k=1:length(temp)
temp(k)=temp(k)/(C*R); %计算每一个灰度级像素点所占的概率
if temp(k)~=0 %去掉概率为0的像素点
H_img=-temp(k)*log2(temp(k))+H_img; %求熵值的公式
end
end


C++代码:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;


// calculate entropy of an image
double Entropy(Mat img)
{
// 将输入的矩阵为图像
double temp[256];
for (int i = 0; i<256; i++)
{
temp[i] = 0.0;
}

// 计算每个像素的累积值
for (int m = 0; m<img.rows; m++)
{// 有效访问行列的方式
const uchar* t = img.ptr<uchar>(m);
for (int n = 0; n<img.cols; n++)
{
int i = t[n];
temp[i] = temp[i] + 1;
}
}
// 计算每个像素的概率
for (int i = 0; i<256; i++)
{
temp[i] = temp[i] / (img.rows*img.cols);
}
double result = 0;
// 根据定义计算图像熵
for (int i = 0; i<256; i++)
{
if (temp[i] == 0.0)
result = result;
else
result = result - temp[i] * (log(temp[i]) / log(2.0));
//result = result - temp[i] * (log2(temp[i]));
}
return result;
}

int main(int argc, char ** argv)
{
const char* imagename = "pano_b.jpg";

//从文件中读入图像
Mat img = imread(imagename);

//如果读入图像失败
if (img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
double a = Entropy(img);
cout<<a<<endl;
return 0;
}



上面这张图的分辨率是2048*2048,MATLAB中行循环2048次,列循环2048*2次;C++中行和列都循环2048次。这是我能想到的唯一不同了。

希望大家帮我看一下为什么计算结果不一样。谢谢~
...全文
854 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
li410426 2017-09-29
  • 打赏
  • 举报
回复
试试分析: matalb读入的数据是在0--1之间的小数,其像素的取值是一定只有256种数值吗,会不会有更多种数据;而采用opencv时RGB的取值在0--255之间的整数。这是我的猜测。
赵4老师 2017-04-17
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
我只想说:图中的那个妹子看起来不错
好的码农,眼神都比较犀利!
yshuise 2017-04-15
  • 打赏
  • 举报
回复
c++为什么不用标准库?那个matrix
gwena 2017-04-14
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
if (temp[i] == 0.0) 修改为 if (temp[i] > -1e-10 && temp[i] < 1e-10) // 假设这里精度为十位有效小数位 C++浮点数是不可以直接 == 比较相等的 还有matlib中的 ~= 是个什么精度,这个也要考虑,C++中 == 这里要保持跟它相同才能计算出相同的值 还有 log log2也是不同的东西
改了精度之后还是不一样 我想的是MATLAB中读入图片保存的是一个3维数组,大小是2048*2048*3,RGB各为一个2048*2048的矩阵;c++中读入图片只是一个2048*2048的矩阵。所以我先把MATLAB中的图片改成了灰度图,然后再计算,但是结果还是不一样。
幻夢之葉 2017-04-14
  • 打赏
  • 举报
回复 2
if (temp[i] == 0.0) 修改为 if (temp[i] > -1e-10 && temp[i] < 1e-10) // 假设这里精度为十位有效小数位 C++浮点数是不可以直接 == 比较相等的 还有matlib中的 ~= 是个什么精度,这个也要考虑,C++中 == 这里要保持跟它相同才能计算出相同的值 还有 log log2也是不同的东西
幻夢之葉 2017-04-14
  • 打赏
  • 举报
回复
我只想说:图中的那个妹子看起来不错

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧