Reputation: 405
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);
}
it gives me a good one. Why this happens? If that byte buffer gets in double medie it is not converted implicit to double?
Upvotes: 2
Views: 617
Reputation: 858
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.
Upvotes: 2