为什么在 .png 格式的图像中检测到彩色像素,而在 .jpg 格式的图像中检测不到?
Why are colour pixels detected in .png format images but not in those in .jpg format?
我有一张白色背景的图片,里面有红色、绿色和蓝色的线条。红绿蓝线仅包含以下值:(255,0,0)、(0,255,0) 和 (0,0,255)。图像现在保存为 .png 和 .jpg。该代码应适用于两种格式。下面的代码是检测颜色和return各个颜色像素的个数。作为 .png 代码有效,作为 .jpg 仅识别绿色像素,但不幸的是不是所有像素。 3种颜色的所有像素怎么也能被.jpg识别?
import cv2
import numpy as np
img = cv2.imread(r"...\red.jpg")
x,y,z = img.shape
print(x,y,z)
r = np.where((img == (0, 0, 255)).all(axis=2))
redarray = np.array(r)
red = np.size(redarray)
g = np.where((img == (0, 255, 0)).all(axis=2))
greenarray = np.array(g)
green = np.size(greenarray)
bl = np.where((img == (255, 0, 0)).all(axis=2))
bluearray = np.array(bl)
blue = np.size(bluearray)
print("red: ", red)
print("green: ", green)
print("blue: ", blue)
在没有看到图像的情况下,jpeg 图像被压缩,如果不小心处理,像素值与等效的 png 图像不同。
两种方法:
- 保存 jpeg 后,您可以尝试使用更高的 resolution/lower 压缩。它可能会起作用。它还会增加文件大小。
- 不是搜索精确值(例如
red == (0, 0, 255)
),而是查找低于某些阈值的像素。例如,定义 th=10
并在以下范围内查找红色像素:green <= 0+th & blue <= 0+th & red >= 255-th
.
抱歉,我在这个答案下没有 运行 代码,如果您需要进一步的屏蔽帮助,请告诉我。
png 是无损 格式,而 jpg 不是 (even if you use quality of 100)。
这就是为什么您的部分原始“纯”像素在保存并从 jpeg 格式重新读取后变得“不纯”的原因。
顺便说一句,你的问题是:
The red green and blue lines are exclusively of the following values:
(255,0,0), (0,255,0) and (0,0,255)
但是 opencv 行为以及您的代码是 BGR。太红了,例如 (0,0,255)
我有一张白色背景的图片,里面有红色、绿色和蓝色的线条。红绿蓝线仅包含以下值:(255,0,0)、(0,255,0) 和 (0,0,255)。图像现在保存为 .png 和 .jpg。该代码应适用于两种格式。下面的代码是检测颜色和return各个颜色像素的个数。作为 .png 代码有效,作为 .jpg 仅识别绿色像素,但不幸的是不是所有像素。 3种颜色的所有像素怎么也能被.jpg识别?
import cv2
import numpy as np
img = cv2.imread(r"...\red.jpg")
x,y,z = img.shape
print(x,y,z)
r = np.where((img == (0, 0, 255)).all(axis=2))
redarray = np.array(r)
red = np.size(redarray)
g = np.where((img == (0, 255, 0)).all(axis=2))
greenarray = np.array(g)
green = np.size(greenarray)
bl = np.where((img == (255, 0, 0)).all(axis=2))
bluearray = np.array(bl)
blue = np.size(bluearray)
print("red: ", red)
print("green: ", green)
print("blue: ", blue)
在没有看到图像的情况下,jpeg 图像被压缩,如果不小心处理,像素值与等效的 png 图像不同。
两种方法:
- 保存 jpeg 后,您可以尝试使用更高的 resolution/lower 压缩。它可能会起作用。它还会增加文件大小。
- 不是搜索精确值(例如
red == (0, 0, 255)
),而是查找低于某些阈值的像素。例如,定义th=10
并在以下范围内查找红色像素:green <= 0+th & blue <= 0+th & red >= 255-th
.
抱歉,我在这个答案下没有 运行 代码,如果您需要进一步的屏蔽帮助,请告诉我。
png 是无损 格式,而 jpg 不是 (even if you use quality of 100)。
这就是为什么您的部分原始“纯”像素在保存并从 jpeg 格式重新读取后变得“不纯”的原因。
顺便说一句,你的问题是:
The red green and blue lines are exclusively of the following values: (255,0,0), (0,255,0) and (0,0,255)
但是 opencv 行为以及您的代码是 BGR。太红了,例如 (0,0,255)