zoukankan      html  css  js  c++  java
  • opencv

    #-*- coding:utf8-*-
    #读取图片
    '''
    1.cv2.imread(文件名,属性)
    属性:指定图像用哪一种方式读取文件
    cv2.IMREAD_COLOR:读入彩色图像,默认参数,Opencv 读取彩色图像为BGR模式 !!!注意
    cv2.IMREAD_GRAYSCALE:读入灰度图像。
    2.
    cv2.imshow(窗口名,图像文件)显示图像 可以创建多个窗口
    3.
    cv2.waitKey()键盘绑定函数
    函数等待待定的几毫秒,看是否有键盘输入
    4.
    cv2.namedWindow(窗口名,属性) 创建一个窗口
    属性:指定窗口大小模式
    cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
    cv2.WINDOW_NORMAL:窗口大小可调整
    5.
    cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
    '''
    import cv2
    img=cv2.imread('sd.jpg', cv2.IMREAD_COLOR)
    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destoryAllWindows()
    #cv2.imwrite(保存图像名,需要保存的图像)   保存图像
    img=cv2.imread('sd.jpg',cv2.IMREAD_COLOR)
    cv2.imshow('image',img)
    k=cv2.waitKey(0)
    if k==27: #等待ESC键
    cv2.destoryAllwindows()
    elif k==ord('s'): #等待's'键来保存和退出
    cv2.imwrite('dehua.jpg',img)#文件名为英文
    cv2.destoryAllWindows()


    #对于图像的一些操作
    import cv2
    img=cv2.imread('sd.jpg',cv2.IMREAD_COLOR)
    print(img.shape)#(300, 375, 3)
    print(img.size)#337500
    print(img.dtype)#uint8
    #在处理图片时,将一些信息直接以文字的形式输出在图片上
    cv2.putText(照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细)
    img=cv2.imread('sd.jpg',cv2.IMREAD_COLOR)
    cv2.putText(img,'there 0 error(s):',(50,150),cv2.FONT_HERSHEY_COMPLEX,6,(0,0,255),25)
    cv2.imshow('image',img)
    cv2.waitKey(0)



    #缩放图片
    '''
    实现缩放图片并保存,在使用OpenCV时常用的操作。cv2.resize()支持多种插值算法,默认使用cv2.INTER_LINEAR,缩小最适合使用:cv2.INTER_AREA,放大最适合使用:cv2.INTER_CUBIC或cv2.INTER_LINEAR。
    res=cv2.resize(image,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
    或者:
    res=cv2.resize(image,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
    此处None本应该是输出图像的尺寸,因为后边设置了缩放因子
    '''
    height,width=img.shape[:2]##获取原图像的水平方向尺寸和垂直方向尺寸。
    res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
    cv2.imshow('res',res)
    cv2.waitKey(0)

    #图像的平移
    '''
    cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
    平移就是将图像换个位置,如果要沿(x,y)方向移动,移动距离为(tx,ty),则需要构建偏移矩阵M。
    '''
    #图片平移(100,50)
    import cv2
    import numpy as np
    img=cv2.imread('dd.jpg',1)
    rows,cols,channel=img.shape
    M=np.float32([[1,0,100],[0,1,50]])
    dst=cv2.warpAffine(img,M,(cols,rows))
    cv2.imshow('img',dst)
    cv2.waitKey(0)
    #其中 (cols,rows)代表输出图像的大小,M为变换矩阵,100代表x的偏移量,50代表y的偏移量,单位为像素。
    #----------------------------------------------------------------------------------------------------


    #OpenCV中首先需要构造一个旋转矩阵,通过cv2.getRotationMatrix2D获得。

    import cv2
    img=cv2.imread('dd.jpg',0)
    rows,cols=img.shape
    #第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
    M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
    #第三个参数为图像的尺寸中心
    dst=cv2.warpAffine(img,M,(2*cols,2*rows))
    cv2.imshow('img',dst)
    cv2.waitKey(0)
    cv2.destoryALLWindows()

    #仿射变换
    '''
    在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建偏移矩阵,需要在原图像中找到三个点以及它们在输出图像中的位置。然后OpenCV中提供了cv2.getAffineTransform创建2*3的矩阵,最后将矩阵传给函数cv2.warpAffine。
    '''
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    img=cv2.imread('test.png')
    rows,cols,ch=img.shape
    pts1=np.float32([[50,50],[200,50],[50,200]])
    pts2=np.float32([[10,100],[200,50],[100,250]])
    M=cv2.getAffineTransform(pts1,pts2)
    dst=cv2.warpAffine(img,M,(cols,rows))
    plt.subplot(121),plt.imshow(img),plt.title('Input')
    plt.subplot(122),plt.imshow(dst),plt.title('Output')
    plt.show()


    #----------------------------------------------------------------
    #透视变换
    '''
    视角变换,需要一个3*3变换矩阵。在变换前后要保证直线还是直线。构建此矩阵需要在输入图像中找寻4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。变换矩阵OpenCV提供cv2.getPerspectiveTransform()构建。然后将矩阵传入函数cv2.warpPerspective。
    '''
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img=cv2.imread('test.png')
    rows,cols,ch=img.shape
    pts1=np.float32([[56,65],[368,52],[28,387],[389,390]])
    pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])
    M=cv2.getPerspectiveTransform(pts1,pts2)
    dst=cv2.warpPerspective(img,M,(300,300))
    plt.subplot(121),plt.imshow(img),plt.title('Input')
    plt.subplot(122),plt.imshow(dst),plt.title('Output')
    plt.show()


    #图像 regions of Interest
    #有时需要对一副图像的特定区域进行操作,ROI使用Numpy索引来获得的。
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    image=cv2.imread('test.png')
    rows,cols,ch=image.shape
    tall=image[0:100,300:700]
    image[0:100,600:1000]=tallall
    cv2.imshow("image",image)
    cv2.waitKey(0)
    cv2.destoryALLWindows()

    # 通道的拆分/合并处理
    '''
    有时需要对BGR三个通道分别进行操作。这时需要将BGR拆分成单个通道。同时有时需要把独立通道的图片合并成一个BGR图像。
    使用OpenCV库函数版本
    '''
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    image=cv2.imread('pitt1.jpg')
    rows,cols,ch=image.shape
    #拆分通道,cv2.split()是一个比较耗时的操作。只有需要时使用,尽量Numpy
    b,g,r=cv2.split(image)
    print (b.shape)
    #(768,1024)
    #合并通道
    image=cv2.merge(b,g,r)

  • 相关阅读:
    android开发中如何开启用户安装的应用程序?
    丑数查找算法
    session.save_path目录大量session临时文件带来的服务器效率问题
    MOSS点滴(1):如何开发和部署feature
    如何将Excel中两个单元格或两列中的数据合并
    如何在 MOSS 2007 启用 Session
    MOSS LIST的一些属性说明
    国外广播电台
    Excel 导出 按钮
    在文档库或 Windows SharePoint Services SharePoint Portal Server 中创建一个新的文件夹或新文档时,您会收到一个"指定的文件或文件夹名太长"错误消息
  • 原文地址:https://www.cnblogs.com/qingsheng/p/9500963.html
Copyright © 2011-2022 走看看