gpt4 book ai didi

java - Opencv Java 灰度图

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:31 25 4
gpt4 key购买 nike

我写了下面的程序试图从彩色转换成灰度

 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);

事实是,如果我这样做,它会给我一个奇怪的图像。如果我像这样更改代码:

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);
}

它给了我一个很好的。为什么会这样?如果该字节缓冲区进入 double 介质,它不会隐式转换为 double?

最佳答案

java中的byte数据类型是一个8位有符号的二进制补码整数。它的最小值为 -128,最大值为 127(含)。因此图像中大于 127 的值被检索为二进制补码整数。这意味着您不能直接使用字节数组。您可以使用任何其他数据类型,即短、整数、浮点、 double 而不是字节来获得异常结果.

关于java - Opencv Java 灰度图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38412000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com