• OpenCV--对图片的基础操作


    一、带着问题去学习?

    1.1 如何获取图片像素,并对其修改?

    1.2 如何获取图片属性?图片又有哪些属性?

    1.3 如何获取区域图片?

    1.4 如何对图片通道进行分割和合并?

    1.5 如何对图片进行填充和延展?

    二、

    2.1 图片像素获取和修改

    1 import cv2
    2 import numpy as np
    3 img = cv2.imread('F:/team.jpg')
    4 px = img[100, 100]  #图片为二维数组,100*100表示横纵坐标,聚焦到一个点
    5 print(px) # [157 166 200] 返回的是该点BGR各个值所组成的数组
    6 
    7 blue = img[100, 100, 0] # 第三个值0代表BGR通道中的B
    8 print(blue) #157
    9 #获取图片像素的另一种方式: item
    10 img.item(100, 100, 0)
    11
    12 #更改像素的值
    13 img.itemset((100, 100, 0) 100)

    2.2 获取图片属性

    1 img.shape #返回(长,宽,通道)
    2 img.size #返回图片总像素数值
    3 img.dtype #返回图片数据类型 

    *注: 这里需要注意dtype属性,很多在OpenCV中发生的错误,都是因为数据类型错误,因此,Debug时,可以多检测它

    2.3 获取区域图片

    因为图片为二维数组,因此使用slice去划分区域

    1 part = img[30:80, 30:80]
    2 img[100:150, 100:150]  = part

    2.4 图片通道分割和合并

    两个API cv2.split() 和 cv2.merge()

    1 b, g, r = cv2.split(img)
    2 img = cv2.merge((b, g, r))
    3 
    4 b = img[:, :, 0]
    5 img[:, : ,2] = 0

    *注:cv2.split()是一个非常耗时的操作

    2.5 图片延展

    cv2. copyMakeBorder()

     1 import cv2
     2 import numpy as np
     3 from matplotlib import pyplot as plt
     4 BLUE = [255,0,0]
     5 img1 = cv2.imread('F:/team.jpg')
     6 
     7 replicate = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REPLICATE)
     8 reflect = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT)
     9 reflect101 = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT_101)
    10 wrap = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_WRAP)
    11 constant= cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_CONSTANT,value=BLUE)
    12 
    13 plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
    14 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
    15 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
    16 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
    17 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
    18 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
    19 plt.show()
  • 相关阅读:
    SDK Tools Dependencies
    hibernate开发中遇到多对多的问题,可以转换为两个一对多
    利用PC 转发 模拟手机端之间socket通信
    假如你被当成精神病关进了精神病院
    通过JSONP实现完美跨域
    查看linux系统版本命令
    Eclipse+python开发环境配置
    linux chkconfig命令参数及用法详解
    Fedora 17 安装后要做的几件事:MP3,桌面定制,root登录等
    Fedora 17 配置 Nginx + Mysql + php
  • 原文地址:https://www.cnblogs.com/bellumpara/p/8613216.html
Copyright © 2020-2023  润新知