为什么可以在 .png 格式的图像中检测到彩色像素,而在 .jpg 格式的图像中却没有?

问题描述

我有一张白色背景的图片,其中有红色、绿色和蓝色线条。红绿线和蓝线仅包含以下值:(255,0)、(0,255,0) 和 (0,255)。图像现在保存为 .png 和 .jpg。代码应该以两种格式工作。以下代码是检测颜色并返回相应颜色像素的数量。作为 .png 代码有效,作为 .jpg 仅识别绿色像素,但不幸的是并非全部。如何用.jpg也能识别所有3种颜色的所有像素?

import cv2
import numpy as np

img = cv2.imread(r"...\red.jpg")
x,y,z = img.shape
print(x,z)

r = np.where((img == (0,255)).all(axis=2))
redarray = np.array(r)
red = np.size(redarray)
g = np.where((img == (0,0)).all(axis=2))
greenarray = np.array(g)
green = np.size(greenarray)
bl = np.where((img == (255,0)).all(axis=2))
bluearray = np.array(bl)
blue = np.size(bluearray)
       

print("red: ",red)
print("green: ",green)
print("blue: ",blue)

解决方法

在没有看到图像的情况下,jpeg 图像被压缩,如果不小心处理,像素值与等效的 png 图像不同。

两种方法:

  1. 保存 jpeg 后,您可以尝试使用更高的分辨率/更低的压缩率。它可能会起作用。它还会增加文件大小。
  2. 不是搜索确切值(例如 red == (0,255)),而是寻找低于某些阈值的像素。例如定义 th=10 并在以下范围内查找红色像素:green <= 0+th & blue <= 0+th & red >= 255-th

抱歉,我在此答案下没有运行代码,如果您需要有关屏蔽的进一步帮助,请告诉我。

,

png 是无损格式,而 jpg 不是 (even if you use quality of 100)。

这就是为什么您的部分原始“纯”像素在保存并从 jpeg 格式重新读取后变得“不纯”的原因。

顺便说一句,你的问题是:

红绿线和蓝线仅代表以下值: (255,0)、(0,255,0) 和 (0,255)

但是 opencv 的行为以及您的代码都是 BGR。所以红色,例如是 (0,255)