在 Python3.7.1 中使用 cv2.imread 形式的 Opencv3 读取 png 图像并且完全没有黑色像素 window
Read png image with cv2.imread form Opencv3 in Python3.7.1 and no pixel at all with black window
我有两张png图片,一张由python library pillow输出为png,由svg字体图片转换而来,另一张 这个是由 windows 10 的绘画程序读取并重新保存到 png 的。
奇怪的是,我用opencv3的cv2.imread函数读取这些图片,一个不行,只有黑色window,另一个 可以。
如何正确读取这些 png 文件?
代码:
import cv2
image_file_path = r""
image = cv2.imread(image_file_path, cv2.IMREAD_ANYDEPTH)
if(! os.path.exists(image_file_path)):
print('NOT EXIST! = ' + image_file_path)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", image)
cv2.waitKey()
图像:
好的:
不正常:
Paint 正在以某种方式转换图像,使其格式与 'typical' imread 例程不兼容。我不确定发生了什么,这可能与 paint 已经删除了 OpenCV 也想删除的 alpha 通道有关(根据他们的文档,没有看代码)。幸运的是你可以绕过它:
I_not_ok = cv2.imread(ImagePath, CV2.IMREAD_UNCHANGED)
I_ok = I_not_ok[:,:,3]
cv2.namedWindow('Image_ok', cv2.WINDOW_NORMAL)
cv2.imshow('Image_ok', I_ok)
cv2.waitKey(0)
第一张图片是 4 通道 RGBA 格式,具有完全无意义、完全不透明的 alpha 通道,您可以忽略它。
第二张图片采用双通道灰度+Alpha 格式,其中所有像素均为纯黑色,形状仅在 Alpha 通道中定义。
所以,基本上你想要:
丢弃第一个图像的最后一个通道,你可以使用cv2.IMREAD_COLOR
丢弃除第二张图像的最后一个通道之外的所有内容,您可以这样做:
im = cv2.imread('2.png',cv2.IMREAD_UNCHANGED)[:,:,-1]
我通过使用 ImageMagick 获得了上述信息,它包含在大多数 Linux 发行版中,并且在 macOS 和 Windows.[=14= 上可用]
我在终端中使用的命令是:
magick identify -verbose 2.png
示例输出
Image: 2.png
Format: PNG (Portable Network Graphics)
Mime type: image/png
Class: DirectClass
Geometry: 1040x1533+0+0
Units: Undefined
Colorspace: Gray
Type: Bilevel
Base type: Undefined
Endianess: Undefined
Depth: 8-bit
Channel depth:
Gray: 1-bit <--- Note 1
Alpha: 8-bit <--- Note 1
Channel statistics:
Pixels: 1594320
Gray:
min: 0 (0) <--- Note 2
max: 0 (0) <--- Note 2
mean: 0 (0)
standard deviation: 0 (0)
kurtosis: -3
skewness: 0
entropy: 4.82164e-05
Alpha:
min: 0 (0) <--- Note 3
max: 255 (1) <--- Note 3
mean: 50.3212 (0.197338)
standard deviation: 101.351 (0.397456)
kurtosis: 0.316613
skewness: 1.52096
entropy: 0.0954769
...
...
我在右上方用箭头和注释做了注释。
注 1:这告诉我图像是灰度 + alpha
注2:这告诉我所有的灰度像素都是黑色的,因为最大值为零,最小值也为零
注3:这告诉我有一些完全透明的像素,还有一些完全不透明的像素
我有两张png图片,一张由python library pillow输出为png,由svg字体图片转换而来,另一张 这个是由 windows 10 的绘画程序读取并重新保存到 png 的。
奇怪的是,我用opencv3的cv2.imread函数读取这些图片,一个不行,只有黑色window,另一个 可以。
如何正确读取这些 png 文件?
代码:
import cv2
image_file_path = r""
image = cv2.imread(image_file_path, cv2.IMREAD_ANYDEPTH)
if(! os.path.exists(image_file_path)):
print('NOT EXIST! = ' + image_file_path)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", image)
cv2.waitKey()
图像:
好的:
不正常:
Paint 正在以某种方式转换图像,使其格式与 'typical' imread 例程不兼容。我不确定发生了什么,这可能与 paint 已经删除了 OpenCV 也想删除的 alpha 通道有关(根据他们的文档,没有看代码)。幸运的是你可以绕过它:
I_not_ok = cv2.imread(ImagePath, CV2.IMREAD_UNCHANGED)
I_ok = I_not_ok[:,:,3]
cv2.namedWindow('Image_ok', cv2.WINDOW_NORMAL)
cv2.imshow('Image_ok', I_ok)
cv2.waitKey(0)
第一张图片是 4 通道 RGBA 格式,具有完全无意义、完全不透明的 alpha 通道,您可以忽略它。
第二张图片采用双通道灰度+Alpha 格式,其中所有像素均为纯黑色,形状仅在 Alpha 通道中定义。
所以,基本上你想要:
丢弃第一个图像的最后一个通道,你可以使用
cv2.IMREAD_COLOR
丢弃除第二张图像的最后一个通道之外的所有内容,您可以这样做:
im = cv2.imread('2.png',cv2.IMREAD_UNCHANGED)[:,:,-1]
我通过使用 ImageMagick 获得了上述信息,它包含在大多数 Linux 发行版中,并且在 macOS 和 Windows.[=14= 上可用]
我在终端中使用的命令是:
magick identify -verbose 2.png
示例输出
Image: 2.png
Format: PNG (Portable Network Graphics)
Mime type: image/png
Class: DirectClass
Geometry: 1040x1533+0+0
Units: Undefined
Colorspace: Gray
Type: Bilevel
Base type: Undefined
Endianess: Undefined
Depth: 8-bit
Channel depth:
Gray: 1-bit <--- Note 1
Alpha: 8-bit <--- Note 1
Channel statistics:
Pixels: 1594320
Gray:
min: 0 (0) <--- Note 2
max: 0 (0) <--- Note 2
mean: 0 (0)
standard deviation: 0 (0)
kurtosis: -3
skewness: 0
entropy: 4.82164e-05
Alpha:
min: 0 (0) <--- Note 3
max: 255 (1) <--- Note 3
mean: 50.3212 (0.197338)
standard deviation: 101.351 (0.397456)
kurtosis: 0.316613
skewness: 1.52096
entropy: 0.0954769
...
...
我在右上方用箭头和注释做了注释。
注 1:这告诉我图像是灰度 + alpha
注2:这告诉我所有的灰度像素都是黑色的,因为最大值为零,最小值也为零
注3:这告诉我有一些完全透明的像素,还有一些完全不透明的像素