opencv读入图片注意事项

Posted 深度之眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv读入图片注意事项相关的知识,希望对你有一定的参考价值。

来源:投稿 作者:蓬蓬奇
编辑:学姐

深度学习数据预处理中常用opencv读入图片,一般在__getitem__函数中调用。本文主要介绍opencv读取图片的一些细节以及注意事项。本文中使用的图片见第6节“opencv测试使用的图片”。

1.如何通过opencv显示图片?

通过Jupyter Notebook运行OpenCV,运行cv2.imshow()时报错。

import cv2

img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)

报错:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
Input In [60], in <cell line: 1>()
----> 1 cv2.imshow("img", img)

error: OpenCV(4.6.0) /io/opencv/modules/highgui/src/window.cpp:1267: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

解决方法:先卸载opencv,再重新安装。(未解决,可直接转下述方法)

conda remove opencv
conda install -c menpo opencv

pip install --upgrade pip
pip install opencv-contrib-python

参考链接:https://blog.csdn.net/tudou2013goodluck/article/details/108402055

报错:内核崩溃。

Kernel Restarting
The kernel for Untitled.ipynb appears to have died. It will restart automatically.

解决方法:opencv读取图片,之后使用matplotlib库显示图片。

下述两个代码均可以:

%matplotlib inline
from matplotlib import pyplot as plt
import cv2

img = cv2.imread('图片路径')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(img)
plt.show()
import cv2

def cv2_imshow(a, **kwargs):
    a = a.clip(0, 255).astype('uint8')
    # cv2 stores colors as BGR; convert to RGB
    if a.ndim == 3:
        if a.shape[2] == 4:
            a = cv2.cvtColor(a, cv2.COLOR_BGRA2RGBA)
        else:
            a = cv2.cvtColor(a, cv2.COLOR_BGR2RGB)

    return plt.imshow(a, **kwargs)

参考链接:https://github.com/jupyter/notebook/issues/3935

2.opencv读入图片默认为BGR

img_path = "00001.png"    # 图片路径
mask_path = "00001_matte.png"  # 对应的图像分割标签路径

%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as np

img_bgr = cv2.imread(img_path, cv2.IMREAD_COLOR)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR->RGB

plt.imshow(img)
plt.show()

第一幅图为原始图片,第二幅图为BGR图片,第三幅图为RGB图片。

3.opencv读入图片默认为HWC

img_rgb.shape
(800, 600, 3)

可以将HWC转变为CHW:

img_rgb = img_rgb.transpose((2, 0, 1))      # hwc --> chw

4.opencv读入图片默认为nd.array形式

cv2.imread()读取图片后以多维数组的形式保存图片信息。

type(img_rgb)
numpy.ndarray

可以转变为torch.tensor,.float()表示转变为torch.float32

img_chw_tensor = torch.from_numpy(img_rgb).float()

5.cv2.imread()

cv2.imread()有两个参数,第一个参数filename是图片路径,第二个参数flag表示图片读取模式,共有三种:

  • cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。

  • cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。

  • cv2.IMREAD_UNCHANGED:包括alpha(包括透明度通道),可以直接写-1。即以不改变图片的方式打开,图片是彩色就是彩色,图片是灰度图像就是灰度图像。

通过cv2.IMREAD_COLOR读入灰度图,三通道数值相同。

mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)  # 读入灰度图
mask1 = cv2.imread(mask_path, cv2.IMREAD_COLOR)     # 读入彩色图
mask2 = cv2.imread(mask_path, cv2.IMREAD_UNCHANGED) # 读入原始图片

print(mask.shape)  # (800, 600)
print(mask1.shape) # (800, 600, 3)
print(mask2.shape) # (800, 600)

第一幅图为mask,第二幅图为mask1,第三幅图为mask2。

import numpy as np
np.set_printoptions(threshold=np.inf)

# np.unique(mask1[:,:,0] == mask1[:,:,1])
print((mask1[:,:,0] == mask1[:,:,1]).all())  # True
print((np.unique(mask1[:,:,2] == mask).all()))
True
True

6.opencv测试使用的图片

可以右键保存下述图片,调试上面代码。

关注下方《学姐带你玩AI》🚀🚀🚀

回复“CVPR”领取CV顶会500多篇经典论文

码字不易,欢迎大家点赞评论收藏!

以上是关于opencv读入图片注意事项的主要内容,如果未能解决你的问题,请参考以下文章

opencv

OpenCV之cv2函数 2

OpenCV模块

python中使用OpenCV处理图片

opencv如何批量读取文件夹中图片

opencv- python使用