Opencv Java灰度 [英] Opencv Java grayscale

查看:89
本文介绍了Opencv Java灰度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I wrote the following program which tries to convert from color to grayscale

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

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

The fact is that it gives me a strange image if i do this.If i change the code like this:

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吗?

it gives me a good one. Why this happens? If that byte buffer gets in double medie it is not converted implicit to double?

推荐答案

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

The byte data type in java is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). So the values which are greater than 127 in your image are retrieved as two's complement integer.That means you can not use byte array directly.you can use any other data type i.e short,int,float,double instead of byte to get excepted result.

这篇关于Opencv Java灰度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆