【发布时间】:2014-02-27 00:45:25
【问题描述】:
我正在尝试使用适用于 Android 的 OpenCV 2.4.8 执行图像标准化。我的测试设备是三星 S3。
我已经编写了一个如下所示的 JNI 函数来执行图像归一化。
我对图像归一化的定义如下:
r' is 255* r/(r+g+b)
g' is 255* g/(r+g+b)
b' is 255* b/(r+g+b)
现在我需要实现它。我已经编写了一个函数来执行此操作。这似乎不起作用。我对我的应用程序的其他部分充满信心(即它们没有错误)。只有这部分会导致问题。
我可能没有正确编写此函数。请帮忙。
我还附上了我的结果的屏幕截图。如果你看这张图片,只有一半看起来是标准化的(但实际上它没有标准化,它只是看起来那样)而另一半不是。为了解决这个问题,我尝试在 for 循环中用 cols 更改行,结果是一样的。
还提供了此代码。
期待一些帮助。 (仅供参考 - 我对 openCV 完全陌生)。感谢理解。
void NormalizeRGB(JNIEnv*, jobject, jlong img)
{
Mat& imgM = *(Mat*)img;
vector<Mat> rgb;
int cols = imgM.cols;
int rows = imgM.rows;
for(int i = 0; i<rows; i++)
{
for(int j = 0; j<cols; j++)
{
Vec3b bgrPixel = imgM.at<Vec3b>(i, j);
float total = bgrPixel.val[0] + bgrPixel.val[1] + bgrPixel.val[2] + 0.00001;
bgrPixel.val[0] = (uchar) 255*bgrPixel.val[0]/total;
bgrPixel.val[1] = (uchar) 255*bgrPixel.val[1]/total;
bgrPixel.val[2] = (uchar) 255*bgrPixel.val[2]/total;
imgM.at<Vec3b>(i, j) = bgrPixel;
}
}
}
【问题讨论】:
-
我尝试将类型 frmo uchar 更改为浮动。我可以看到一些抖动效果,但这会在大约 5 秒后导致崩溃。
-
也许你得到的值大于 255?如果值大于 255,则应将其重置为 255。当我说 255 时,我的意思是表示 255 的任何浮点值。
-
我无法获得超过 255 的值。因为 bgrPixel.val[]/total 的比率将小于或等于 1。
标签: java android c++ opencv image-processing