因此,对于超过10000个openCV图像,我想执行类似
的操作 int maxVal;
int minVal;
int wh = w*h;
int values[1000];
for(x=0;x<w;x++){
for(y=0;y<h;y++){
double RealColor = cvGetReal2D(source, y, x);
values[x*h + y] = RealColor;
}
}
minVal = *min_element(values,(values+wh));
maxVal = *max_element(values,(values+wh));
float dif = maxVal - minVal;
float fminVal;
fminVal = minVal;
for(x=0;x<w;x++){
for(y=0;y<h;y++){
float rc = cvGetReal2D(source, y, x);
float normRealColor =(rc - fminVal) / dif;
file << normRealColor << " ";
}
file << endl;
}file << endl;
我的所有图像都是8 * 8大小的B&amp; W但它会返回给我:
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
并不总是返回!!!我不时得到像
这样的东西0 0 0 0.166667 0.166667 0.333333 0.333333 0.333333
0.166667 0.166667 0.166667 0.333333 0.333333 0.5 0.5 0.5
0.333333 0.333333 0.5 0.5 0.666667 0.666667 0.666667 0.833333
0.5 0.5 0.666667 0.666667 0.833333 0.833333 0.833333 1
0.666667 0.666667 0.666667 0.833333 0.833333 1 1 1
0.5 0.666667 0.666667 0.666667 0.833333 0.833333 1 1
0.5 0.5 0.5 0.666667 0.666667 0.833333 0.833333 0.833333
0.333333 0.5 0.5 0.5 0.666667 0.666667 0.833333 0.833333
有什么想法吗?
BTW(我知道有cvNormalize(source,source,1,0,CV_MINMAX);但我需要使用手写代码......)答案 0 :(得分:5)
这是除以0的结果,这意味着diff
为0,这意味着您的一些图像是“平坦的”,因此minVal == maxVal
。
答案 1 :(得分:4)
RealColor是双倍的。 values是一个int数组。你把所有东西都推到了一边,而不顾你失去的东西。
minval / maxval是整数,但是当你拿出它们的差值时,你将它放入浮点数。这不会让你神奇地恢复你的精确度。它消失了。
使minval,maxval和值成为双精度而不是整数。并处理div / 0案例。试试看,看看它是否更好。
答案 2 :(得分:1)
diff不经意地为0.0,这意味着
min_element(值(值+ WH)); max_element(值(值+ WH));没有做你认为的事情
或您的图片错误(您是否正在检查是否正在加载有效图片?)
答案 3 :(得分:1)
如果dif
为0.0
,那么你最终会得到像你这样的无穷大。