zoukankan      html  css  js  c++  java
  • opencv学习(一)——图像入门

    图像入门

    一、读取图像

    在opencv中使用cv.imread(filename, flags)函数读取图像。filename参数表示读取图像的路径。读取图像的路径应完整给出,且不能含有中文,否则在调用cv.show()函数显示图片时会显示以下错误:

    第二个参数是一个flag,表示读取图像的方式,分别是:

    • cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志
    • cv.IMREAD_GRAYSCALE:以灰度模式加载图像
    • cv.IMREAD_UNCHANGED:加载图像,包括alpha通道

    image

    除了这三种读取方式,还可以分别用1、0或1表示以上三种方式

    我们运行以下代码,通过这三种模式,来看一下实际效果:

    import cv2
    import numpy as np
    
    img1 = cv2.imread('../../../datasets/image/cat.jpg', 1)#加载彩色图像
    img2 = cv2.imread('../../../datasets/image/cat.jpg', 0)#加载灰度图像
    img3 = cv2.imread('../../../datasets/image/cat.jpg', -1)#加载图像,包括alpha通道
    def cv_show(name, img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    cv_show('img1_3', np.hstack((img1, img3)))
    cv_show('img2', img2)
    

    image

    注意看中间和最右侧的图片并没什么肉眼可见的差异,但实际上以cv.IMREAD_UNCHANGED方式读取图像会包含alpha通道,即加载一张图片的透明和半透明度。

    二、显示图像

    使用函数cv.imshow(winname, mat)在窗口中显示图像。窗口自动适合图像尺寸。

    第一个参数是窗口名称,它是一个字符串。第二个参数是我们的对象。你可以根据需要创建任意多个窗口,可以使用不同的窗口名称。

    代码如下:

    img = cv2.imread('../../../datasets/image/cat.jpg')
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    image

    cv.waitKey(delay)是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果delay=0,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如,如果按下键 a 等,我们将在下面讨论。

    除了键盘绑定事件外,此功能还处理许多其他GUI事件,因此你必须使用它来实际显示图像

    cv.destroyAllWindows()只会破坏我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函数cv.destroyWindow(winname)在其中传递确切的窗口名称作为参数。

    在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,你可以指定窗口是否可调整大小。这是通过功能 cv.namedWindow(winname, flags)完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。

    img = cv2.imread('../../../datasets/image/cat.jpg')
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    image

    三、保存图像

    保存图像,用这个函数cv.imwrite(filename, img)

    第一个参数是文件名,第二个参数是你要保存的图像。

    cv2.imwrite('../../../datasets/image/cat_gray.jpg', img2)
    

    如果图像保存成功,会返回一下结果:

    image

    来让图像显示一下:

    img = cv2.imread('../../../datasets/image/cat_gray.jpg')
    cv_show('img', img)
    

    image

    四、总结

    在下面的程序中,以灰度加载图像,显示图像,按 s 保存图像并退出,或者按 ESC 键直接退出而不保存。

    img = cv2.imread('../../../datasets/image/cat.jpg', 0)
    cv2.imshow('img', img)
    k = cv2.waitKey(0)
    if k == 27:        #等待ESC退出
        cv2.destroyAllWindows()
    elif k == ord('s'):           #等待关键字‘s’,保存并退出
        cv2.imwrite('../../../datasets/image/cat.png', img)
        cv2.destroyAllWindows()
    

    如果你使用的是 64 位机器,你需要修改k = cv.waitKey(0)像这样:k = cv.waitKey(0) & 0xFF

    五、彩色图像、灰度图像、二值图像图像和伪彩色图像的区别

    • 彩色图像:RGB图像,有255 x 255 x 255种颜色。

    image

    • 灰度图像:有不同深度的灰色和黑白两色。三个通道的数值一样。

    image

    • 二值图像:非黑即白,即只有黑色和白色,表现在像素上就是只有0和255。

    image

    • 伪彩色图像:伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色,生成的图像为伪彩色图像。

    image

    • 色彩丰富程度:彩色图像>伪彩色图像>灰度图像>二值图像
  • 相关阅读:
    3.29Java流程控制语句之循环结构
    3.27Java自动类型转化
    3.27Java流程控制语句
    3.27字符串连接符
    计算机系统概论
    《算法导论》第12章 二叉查找树 (2)查找、插入与删除
    《算法导论》第14章 数据结构的扩张 (1)动态顺序统计
    《算法导论》第12章 二叉查找树 (3)基数树
    关于算法学习的总结和感悟(原创)
    《Windows游戏编程大师技巧》二、Windows编程模型
  • 原文地址:https://www.cnblogs.com/mogebw/p/15490097.html
Copyright © 2011-2022 走看看