微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么可以在 .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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。