Python和Java读取JPG图片时的区别
Differences between Python and Java when reading JPG images
我试图了解在 Python 和 Java 中阅读 jpg 图像之间的区别。
两种语言的 opencv 实现似乎不同。
Python:
## create a random image and save it
img = np.random.randint(0,200,size=(192,336,3))
cv.imwrite("rnd.jpg",img)
## read the image in python
img = cv.imread("rnd.jpg")
img.max(axis=(0,1))
## result: array([255, 228, 255], dtype=uint8)
Java:
// read the same image in java
Mat img = Imgcodecs.imread("rnd.jpg");
List<Mat> channels = new ArrayList<Mat>();
Core.split(img, channels);
channels.forEach(ch -> System.out.println(Core.minMaxLoc(ch).maxVal));
## Result:231.0 219.0 234.0
opencv 的 python 实现似乎没有以与 Java 实现相同的方式解码 jpg。
有没有办法确保两者给出相同的结果?
根据 this answer on Photography Stack Exchange JPEG:s 不能保证使用不同的解码器解码到相同的位。但是,差异应该“非常非常小”。我不知道你的结果是否超出规格,但似乎合理的是,使用随机数据应该会在任何 decoder/encoder 组合中带来最差的...
我试图了解在 Python 和 Java 中阅读 jpg 图像之间的区别。 两种语言的 opencv 实现似乎不同。
Python:
## create a random image and save it
img = np.random.randint(0,200,size=(192,336,3))
cv.imwrite("rnd.jpg",img)
## read the image in python
img = cv.imread("rnd.jpg")
img.max(axis=(0,1))
## result: array([255, 228, 255], dtype=uint8)
Java:
// read the same image in java
Mat img = Imgcodecs.imread("rnd.jpg");
List<Mat> channels = new ArrayList<Mat>();
Core.split(img, channels);
channels.forEach(ch -> System.out.println(Core.minMaxLoc(ch).maxVal));
## Result:231.0 219.0 234.0
opencv 的 python 实现似乎没有以与 Java 实现相同的方式解码 jpg。
有没有办法确保两者给出相同的结果?
根据 this answer on Photography Stack Exchange JPEG:s 不能保证使用不同的解码器解码到相同的位。但是,差异应该“非常非常小”。我不知道你的结果是否超出规格,但似乎合理的是,使用随机数据应该会在任何 decoder/encoder 组合中带来最差的...