OpenCV-Python学习笔记(1)----图像基本读写操作

官网tutorials

  • 一些理解:

图像信息在计算机中其实是作为一个array存在的。

对于灰度图,每个像素的值可以用一个uint8型表示(0->255,黑->白)。这样整个灰度图的图片可以用一个二维数组表示。

例如,对于200x300(200,300指像素,一共有60000个像素)大小的灰度图,可以用一个uint8 array[200, 300]表示。

对于彩色图片,每个像素的位置还是用一个二位数组表示,而该位置处的像素值可以用一个size等于3的向量表示(例如3通道RGB图)。整个图片可以用一个width * height * number_of_channel表示(例如200*300*3)。有些图片格式还有透明度信息,此时每个像素值将有4个channel。

对于R, G, B三个channel,每个channel可以用一个uint8表示,在R这个channel上,其值0->255表示黑色->红色(前提是另外两个channel你都设为了0)。

写个代码练一练:

  • 生成原始的图像数据:
img = np.zeros(shape = (300, 400), dtype = np.uint8)

img包含了一些属性:

print(img.shape)    #output 300x400
print(img.size)
print(img.dtype)
print(img

运行结果:

(300, 400)
120000
uint8
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
  • 保存原始图像数据到指定图片格式:
cv2.imwrite("/home/kyle/Pictures/gray_img.jpg", img)

注意:在imwrite中,路径参数不能用~/Pictures/***.jpg,我也不知为什么,如果这样用的话程序运行不会报错,但是在那个路径下找不到保存的图片文件。

然后就可以用图片查看工具打开gray_img.jpg了。打开后你会发现是个全黑的图片,因为每个像素的值都是0。

扫描二维码关注公众号,回复: 14661010 查看本文章
  • 图片类型转换:

例如将上一步生成的单通道的灰度图转换为3通道的BGR图:

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
print(img.shape)    #output 300x400x3, 3 channel.
print(img.size)
print(img.dtype)
print(img

打印输出:

(300, 400, 3)
360000
uint8
[[[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]]
  • 修改图片指定像素的值
#img[:, :] = 200    #change the value of all channels to 200.
img[:, :, 1] = 200    #change the value of channel 1 to 200. 
print(img)
  • 显示图片:

如果需要手动调整显示图片的窗口,需要cv2.namedWindow("Image",cv2.WINDOW_NORMAL)

如果需要窗口自适应图片大小,需要cv2.namedWindow("Image",cv2.WINDOW_AUTOSIZE)

默认是窗口自适应。

cv2.namedWindow("Image")
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 读取图片:

默认情况下,即使图像文件为灰度格式,imread()函数也会返回BGR格式的图像。该函数包含一些可配置的参数:

IMREAD_GRAYSCALE = 0
IMREAD_COLOR     = 1
IMREAD_ANYDEPTH  = 2
IMREAD_ANYCOLOR  = 4
IMREAD_LOAD_GDAL = 8
IMREAD_UNCHANGED = -1

例如,将一幅彩色图片以灰度图的方式读取,并以灰度图的方式保存到本地:

grayImage = cv2.imread("/home/kyle/Pictures/test.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imwrite("/home/kyle/Pictures/test_gray.png", grayImage)

原图与另存后的图:

 

你也可以尝试其他参数,查看读取的结果。 

完整代码:

GitHub地址:GitHub

#!/usr/bin/env python3

import numpy as np
from cv2 import cv2 #if you use "import cv2", it will occurs some error prompt in vscode.

def test():
    img = np.zeros(shape = (300, 400), dtype = np.uint8)

    print(img.shape)    #output 300x400
    print(img.size)
    print(img.dtype)
    print(img)

    #save img to file. I don't know why can't use "~/Pictures/gray_img.jpg".
    cv2.imwrite("/home/kyle/Pictures/gray_img.jpg", img)

    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    print(img.shape)    #output 300x400x3, 3 channel.
    print(img.size)
    print(img.dtype)
    print(img)

    #img[:, :] = 200    #change the value of all channels to 200.
    img[:, :, 1] = 200    #change the value of channel 1 to 200. 
    cv2.imwrite("/home/kyle/Pictures/color_img.jpg", img)
    print(img)

    img[90:190, 30:120, 0] = 255

    cv2.namedWindow("Image")    #not necessary.
    cv2.imshow("Image", img)

    grayImage = cv2.imread("/home/kyle/Pictures/test.jpg", cv2.IMREAD_GRAYSCALE)
    cv2.imwrite("/home/kyle/Pictures/test_gray.png", grayImage)
    cv2.namedWindow("Image2")
    cv2.imshow("Image2", grayImage)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    test()

猜你喜欢

转载自blog.csdn.net/Drknown/article/details/89178331