欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python3中opencv图片读取与展示

程序员文章站 2022-07-13 09:13:05
...

图像入门

目标

  • 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像
  • 你将学习这些函数:cv2.imread(),cv2.imshow(),cv2.imwrite()
  • 或者,您将学习如何使用Matplotlib显示图像

读入图像

使用函数cv2.imread()来读取图像。图像应该在工作目录中,或者应该给出图像的完整路径

imread(filename[, flags]) -> retval

函数imread从指定文件加载图像并返回一个numpy.ndarray对象类型像素值。 如果图像无法读取(由于文件丢失,权限不当,格式不受支持或格式无效),函数返回一个空矩阵

第二个参数是一个标志,用于指定应读取图像的方式。

  • cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。 flags=1
  • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 flags=0
  • cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像 flags=-1

注意

而不是这三个标志,你可以简单地传递整数1,0或-1。

如:

import cv2
import numpy
# Load an color image in color
img = cv2.imread("image0.jpg", 1)
img
array([[[ 34,  36,  30],
        [ 33,  35,  29],
        [ 31,  33,  27],
        ..., 
        [ 85, 110,  60],
        [ 85, 110,  60],
        [ 85, 110,  60]],

       [[ 32,  34,  28],
        [ 31,  33,  27],
        [ 30,  32,  26],
        ..., 
        [ 80, 107,  57],
        [ 81, 106,  56],
        [ 81, 106,  56]],

       [[ 31,  33,  27],
        [ 31,  33,  27],
        [ 30,  32,  26],
        ..., 
        [ 80, 107,  57],
        [ 77, 104,  54],
        [ 77, 104,  54]],

       ..., 
       [[ 11,  16,  19],
        [ 13,  15,  15],
        [ 15,  19,  14],
        ..., 
        [ 16,  16,  16],
        [  9,  11,  11],
        [ 10,  12,  12]],

       [[ 11,  16,  19],
        [ 13,  15,  15],
        [ 15,  19,  14],
        ..., 
        [ 16,  16,  16],
        [ 14,  16,  16],
        [ 15,  17,  17]],

       [[ 11,  16,  19],
        [ 13,  15,  15],
        [ 15,  19,  14],
        ..., 
        [ 16,  16,  16],
        [ 17,  19,  19],
        [ 17,  19,  19]]], dtype=uint8)

python3中opencv图片读取与展示

警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print img时得到的结果是None。

显示图像

使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一
个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜
欢,但是必须给他们不同的名字

cv2.imshow("image",img)
cv2.waitKey (0)
cv2.destroyAllWindows()

python3中opencv图片读取与展示

cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫
秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果
按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没
有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限
期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否
被按下,这个后面我们会接着讨论。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果
你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删
除的窗口名。

 建 议:一 种 特 殊 的 情 况 是, 你 也 可 以 先 创 建 一 个 窗 口, 之 后再 加 载 图 像。 这 种 情 况 下, 你 可 以 决 定 窗 口 是 否 可 以* 调 整大 小*。 使 用 到 的 函 数 是 cv2.namedWindow()。 初 始 设 定 函 数标 签 是 cv2.WINDOW_AUTOSIZE。 但 是 如 果 你 把 标 签 改 成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存图像

使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。

cv2.imwrite("messigray.png", img)
True

总结一下

下面的程序将会加载一个灰度图, 显示图片,按下’s’键保存后退出,或者
按下 ESC 键退出不保存。

import numpy as np
import cv2

img = cv2.imread('image0.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit 如果 按下任意键,这个函数会返回按键的 ASCII 码值
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

警告:如果你用的是 64 位系统,你需要将 k = cv2.waitKey(0) 这行改成k = cv2.waitKey(0)&0xFF。

使用 Matplotlib

Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。之后会陆续了解到。现在,你可以学习怎样用 Matplotib 显示图像。你可以放大图像,保存它等等。

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

img = cv2.imread('image0.jpg',0)
# print(img)
# img2 = img[:,:,::-1]
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

python3中opencv图片读取与展示

参见:Matplotib 有多种绘图选择。具体可以参见 Matplotib docs。我们也会陆续了解一些
  注意:彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正确显示。具体细节请看练习

使用opencv读取RGB图片时,使用matplotlib会出现如下图所示的情况,这是因为opencv使用的是BGR模式,而matplotlib使用的是RGB模式,如果想要使用matplotlib加载opencv读取的图片,需要将其转换成为RGB模式。

第一种方法:

b,g, r = cv2.split(img)
img2 = cv2.merge([r,g,b])

第二种方法:更加简洁的转换方法

img2 = img[:,:,::-1]

第三种方法:

img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
相关标签: opencv cv