opencv实现的Java灰度

我写了下面的程序,其试图从颜色转换为灰度opencv实现的Java灰度

Mat newImage = Imgcodecs.imread("q1.jpg"); 

Mat image=new Mat(new Size(newImage.cols(),newImage.rows()),CvType.CV_64FC3);

int totalBytes = (int)(newImage.total() * newImage.elemSize());

byte buffer[] = new byte[totalBytes];

newImage.get(0, 0,buffer);

double b[]=new double [totalBytes];

for(int i=0;i<totalBytes;i=i+3){

{

double medie=(buffer[i]+buffer[i+1]+buffer[i+2])/3;

b[i]=medie;

b[i+1]=medie;

b[i+2]=medie;

}

}

image.put(0, 0, b);

Imgcodecs.imwrite("tu3.jpg",image);

事实是,它给了我一个奇怪的形象,如果我这样做this.If我改变这样的代码:

public static void main(String[] args) { 

Mat newImage = Imgcodecs.imread("q1.jpg");

newImage.convertTo(newImage, CvType.CV_64FC3);

Mat image=new Mat(new Size(newImage.cols(),newImage.rows()),CvType.CV_64FC3);

int totalBytes = (int)(newImage.total() * newImage.elemSize());

double buffer[] = new double[totalBytes];

newImage.get(0, 0,buffer);

double b[]=new double [totalBytes];

for(int i=0;i<totalBytes;i=i+3){

{

double medie=(double)((buffer[i]+buffer[i+1]+buffer[i+2]))/3;

b[i]=medie;

b[i+1]=medie;

b[i+2]=medie;

}

}

image.put(0, 0, b);

Imgcodecs.imwrite("tu3.jpg",image);

}

它给了我一个很好的。为什么会发生?如果该字节缓冲区进入双重缓冲区,它不会被转换为隐式双重缓冲区?

回答:

java中的字节数据类型是一个8位带符号的二进制补码整数。它的最小值为-128,最大值为127(包括)。因此,图像中大于127的值将作为二进制补码整数进行检索。这意味着您不能直接使用字节数组。您可以使用任何其他数据类型(即short,int,float,double而不是byte)来获得例外结果。

以上是 opencv实现的Java灰度 的全部内容, 来源链接: utcz.com/qa/266587.html

回到顶部