opencv java修改像素值

时间:2015-05-05 15:14:46

标签: java opencv image-processing

我一直在尝试在opencv java中转换一些opencv C ++代码,我似乎无法让像素分区正常工作。我拿了一个平均分段的垫子,我将其转换为灰度,然后转换为32F。

然后我将最下采样然后上采样的图像(由灰色的平移垫组成)与原始的灰色平移垫进行比较。

我已阅读Using get() and put() to access pixel values in OpenCV for Java

但是,它和其他人一样不行。我得到的错误消息是无效的垫子类型5.然而,即使我能够看到显着性图,我是肯定的,这是错误的。这是因为当我在c ++中传入图像001.jpg时,我应该看到原始图像+对象周围的红色方块。在java中,我只是在最后看到原始图像。

注意:

AbstractImageProvider.deepCopy(AbstractImageProvider.matToBufferedImage(显着性),DISP);

当我尝试显示原始垫子,meanShift垫子和灰色meanShift垫子时,API调用是否有效。它没有表现出显着性。

C ++

我只进行了频道分割,因为我正在测试其他颜色空间,但是在java中我只想使用灰度。

'\r\n'

的java

#include <iostream>
using namespace std;

int main() {

    int var{ 0 };

    cout << "Bitte eine Ganzzahl eingeben: ";
    if ((cin >> var) == false) {
        cerr << "Falsche Eingabe - Keine Zahl\n";
        exit(1);
    }


    system("pause");
    //return 0;
}

1 个答案:

答案 0 :(得分:2)

经过大量搜索后找到了一个简单而有效的解决方案。这可能有助于您超越错误 - 无效的垫类型5

<强>代码:

Mat img = Highgui.imread("Input.jpg"); //Reads image from the file system and puts into matrix
int rows = img.rows(); //Calculates number of rows
int cols = img.cols(); //Calculates number of columns
int ch = img.channels(); //Calculates number of channels (Grayscale: 1, RGB: 3, etc.)

for (int i=0; i<rows; i++)
{
    for (int j=0; j<cols; j++)
    {
        double[] data = img.get(i, j); //Stores element in an array
        for (int k = 0; k < ch; k++) //Runs for the available number of channels
        {
            data[k] = data[k] * 2; //Pixel modification done here
        }
        img.put(i, j, data); //Puts element back into matrix
    }
}
Highgui.imwrite("Output.jpg", img); //Writes image back to the file system using values of the modified matrix

注意:在线任何地方都没有提及的重要一点是方法put不会将像素写入Input.jpg。它只是更新矩阵img的值。因此,上述代码不会改变输入图像中的任何内容。为了产生可见输出,需要将矩阵img写入文件,即Output.jpg。此外,使用img.get(i, j)似乎是处理矩阵元素的更好方法,而不是使用上面接受的解决方案,因为这有助于以更好的方式可视化和处理图像矩阵,并且不需要大的连续内存分配