Opencv Java灰度

时间:2016-07-16 14:04:45

标签: java opencv

我编写了以下程序,试图将颜色转换为灰度

 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 medie,则它不会隐式转换为double?

1 个答案:

答案 0 :(得分:2)

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