【问题标题】:How to perform Image RGB Normalization in Android OpenCV?如何在 Android OpenCV 中执行图像 RGB 归一化?
【发布时间】: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


【解决方案1】:

我找到了解决问题的方法。

我试图使用这个函数来读取一个 RGBA 矩阵图像。 RGBA Matrix 图像的类型为 Vec4。

我试图将其读取为 Vec3 〜这曾经导致上述问题。

通过这个小小的改动,我得到了预期的结果。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2015-08-04
    • 2019-06-28
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多