zoukankan      html  css  js  c++  java
  • python3+Opencv 搭建环境和基本操作

    一、必备前提:

    Python3.5及以上版本、pip、windows环境

    二、搭建opencv

    该部分可以创建隔绝的Python环境来引入,参照virtualenv的使用

     在目标的cmd窗口,依次输入以下命令:

    pip install --upgrade setuptools
    pip install numpy Matplotlib
    pip install opencv-python

    如果下载中间出现error或wrong,重新输入命令即可。

    如果多次下载失败,可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下载whl包安装,安装whl包依然使用pip

    pip install 包的位置(如:C:downloadxxx.whl)

    三、示例代码

    读入图片:

    cv.imread(filepath,flags)

    filepath:要读入图片的完整路径
    flags:读入图片的标志 
    cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道(1)
    cv2.IMREAD_GRAYSCALE:读入灰度图片(0)
    cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道(-1)

    支持 bmp、jpg、png、tiff 等常用格式,详情可以查看imread()方法的文档注释


    显示图片:

    cv.imshow('image',img)
    cv.waitKey(0)
    cv.destroyAllWindows()#cv.destroyWindow(wname)

    cv2.imshow(wname,img)显示图像,第一个参数是显示图像的窗口的名字,第二个参数是要显示的图像(imread读入的图像),窗口大小自动调整为图片大小

    cv2.waitKey顾名思义等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。

    cv2.destroyAllWindow()销毁所有窗口
    cv2.destroyWindow(wname)销毁指定窗口

    保存图片:

    cv2.imwrite(file,img,num)

    第一个参数是要保存的文件名,保存支持格式同读取,按需保存
    第二个参数是要保存的图像。
    可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.

    cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int 
    cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。

    cv2.imwrite('1.jpeg',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
    cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

    此处需注意,按照默认质量保存图片为JPEG files(*.jpeg, *.jpe, *.jpg)时,由于jpeg压缩版本在压缩过程中导致了部分像素丢失,会导致保存后的像素点值与写入前有差别。

    保存图片为png格式,即可以解决此问题

    示例代码:读入一副图像,按’s’键保存后退出,其它任意键则直接退出不保存

    import cv2 as cv
    img = cv.imread('D:python	est.jpg',cv2.IMREAD_UNCHANGED)
    cv.imshow('image',img)
    k = cv.waitKey(0)
    if k == ord('s'): 
        # wait for 's' key to save and exit   
        cv.imwrite('1.png',img)    
        cv.destroyAllWindows()
    else:     
        cv.destroyAllWindows()

    四、图像的基本操作

    创建图片

    1.创建三通道

    import numpy as np
    import cv2 as cv
    
    # 三通道
    creat_img3 = np.zeros([400, 400, 3], np.uint8)  # 高400*宽400*通道3 单通道8位
    creat_img3[:, :, 0] = np.ones([400, 400]) * 255  # 0(Blue)通道全部赋值255
    creat_img3[:, :, 2] = np.ones([400, 400]) * 255  # 2(Red)通道全部赋值255
    cv.imshow("create image3", creat_img3)

    2.创建单通道

    # 单通道
    creat_img1 = np.zeros([400, 400, 1], np.uint8)
    creat_img1[:, :, 0] = np.ones([400, 400]) * 127  # 单通道灰度图像
    cv.imshow("create image1", creat_img1)

    3.创建小尺寸

    # 生成小尺寸图片
    mini_img = np.ones([3, 3], np.float)
    mini_img.fill(127.1)  # .fill方法填充数据
    mini_img2 = mini_img.reshape([1, 9])  # reshape只改变形状,不改变数据
    print(mini_img, mini_img2)

    以上内容摘自:https://blog.csdn.net/l0ve777/article/details/88715704

    读取图片并编辑

    import cv2 as cv
    
    img = cv.imread("D://test.jpeg")
    #对 BGR 图像而言,返回值为 B, G, R 的值,对灰度图像而言,会返回他的灰度值。即彩图返回三通道三维数组,灰度图返回单通道三维数组,小图返回二维数组
    print(img[100,100])      #[ 42  57 130]
    print(img.item(100,100,2))   #130
    img.itemset((100,100,2),25)  #img[100,100,2]=25
    print(img.item(100,100,2))   #25

    获取图像属性

    import cv2 as cv
    
    img = cv.imread("D://test.jpeg")
    # img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组。行数对应坐标轴上的y轴,即高度;而列数对应x轴,即宽度。返回值可以理解为高度,宽度,通道数。
    print(img.shape)     #(512, 512, 3)
    # img.size 可以返回图像的像素数目。
    print(img.size)    #786432
    #img.dtype 返回的是图像的数据类型。
    print(img.dtype)   #uint8

     设置ROI

    ROI(Region of Interest)是指图像中的一个矩形区域,如果后续需要单独处理某一个小区域,可以设置ROI

    import cv2 as cv
    
    ballImg = img[380:512,230:350]   #利用numpy中的数组切片设置ROI区域
    img[0:132,0:120] = ballImg       #将设置的ROI区域添加到原图像的左上方
    
    cv.namedWindow("Image")
    cv.imshow("Image", img)
    cv.waitKey(0)

     

    拆分及合并图像通道

    要对单个通道进行操作的时候,需要拆分出单个通道,有2种方法

    1)用opencv自带的split函数

    保存图片

    需注意按照需要,保存不同格式

     1 mini_img = np.ones([3, 3], np.uint8)
     2 mini_img.fill(127)  # .fill方法填充数据
     3 #mini_img2 = mini_img.reshape([1, 9])  # reshape只改变形状,不改变数据
     4 #print(mini_img, mini_img2)
     5 print(mini_img)
     6 cv.imshow("mini_img", mini_img)
     7 cv.waitKey(0) #毫秒级,0为无限等待
     8 cv.imwrite('mini.jpg', mini_img)
     9 
    10 image = cv.imread('mini.jpg',0) #0表示灰度图
    11 print(image)
    12 
    13 image[0][0] = 100 #image.itemset(0,100)
    14 image[1][0] = 40  #image.itemset((1,0),40)
    15 cv.imshow("mini_img", image)
    16 cv.waitKey(0)
    17 cv.imwrite('mini2.jpg', image)
    18 
    19 image = cv.imread('mini2.jpg',0)
    20 print(image)

    以上三处打印分别为:

    [[127 127 127]
     [127 127 127]
     [127 127 127]]
    
    [[127 127 127]
     [127 127 127]
     [127 127 127]]
    
    [[100 126 125]
     [ 39 131 127]
     [128 127 124]]

    发现,为灰度图(即像素数相同,为127)时,读图数据与写入一致,但是当改变了其中某些像素值后,读图数据发生了变化,

    是由于jpeg压缩版本在压缩过程中导致了部分像素丢失,保存图片为tif格式或者png格式,即可以解决此问题

    cv.imwrite('mini2.png', image)
    
    image = cv.imread('mini2.png',0)
  • 相关阅读:
    C#中怎么设置comboBox1为只读,即不可在里面进行编辑?
    笔记
    Head First ObjectOriented Analysis & Design 读书 概记
    看到这篇东西 ,要收藏 呵呵
    HELLO OPENGL
    调试opengl程序出错
    HeadFirst C# 读书笔记 0426
    css布局容易范的一些错误
    百度新年贪吃蛇效果
    css3教程:boxsizing属性说明
  • 原文地址:https://www.cnblogs.com/sen-c7/p/11171242.html
Copyright © 2011-2022 走看看