Python进阶——OpenCV之Core Operations

文章目录

  • 图像基本操作
    • 访问并修改像素值
    • 访问图像的属性
    • 设置图像区域
    • 图像分割与合并
    • 画图像边框
  • 图像的数学操作
    • 图像叠加
    • 图像融合
    • 图像位操作
  • Python OpenCV代码检测与速度优化

时隔一个月,续接上一篇,接着学习Core Operations。中间研究了下怎么用Python+opencv实现录屏,耽搁了一个星期时间,不过也巩固了第一篇的内容。
opencv的 Core Operations操作主要是跟numpy模块有关,因此还提前看了一下numpy模块的用法,关于这个模块的介绍有很多,这里就不对numpy做过多的说明了。

图像基本操作

访问并修改像素值

>>> import cv2>>> import numpy as np>>> img = cv2.imread('messi5.jpg')>>> px = img[100,100]>>> print px[157 166 200]# accessing only blue pixel,opencv图像存储为大端格式:BGR>>> blue = img[100,100,0]>>> print blue157>>> green = img[100,100,1]>>> print green166>>> red = img[100,100,2]>>> print red200# modify the pixel values>>> img[100,100] = [255,255,255]>>> print img[100,100][255 255 255]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Numpy 是经过优化的快速矩阵计算库,单独读写某一个像素点速度很慢,以上几个像素操作方法,其实更适合操作一个图像区域。如果要操作单个像素点,推荐使用array.item() and array.itemset()

# accessing RED value>>> img.item(10,10,2)59# modifying RED value>>> img.itemset((10,10,2),100)>>> img.item(10,10,2)100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

访问图像的属性

图像的属性主要包括图像的行、列、像素的通道数、图像的类型、像素的个数等。以下几个函数主要访问图像的属性。

# img.shape属性返回图像的行、列、颜色通道数(如果是彩色图像)# 如果是灰度图像,此属性只返回图像的行、列大小>>> print img.shape(342, 548, 3)# 图像的总像素个数>>> print img.size562248#图像每一个像素数据类型>>> print img.dtypeuint8#img.dtype is very important while debugging because a large number of errors in OpenCV-Python code is caused by invalid datatype.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

设置图像区域

典型操作,例如人眼检测,最好先进行人脸检测,然后在检测到的人脸范围内进行人眼检测,眼睛总是在脸上,因此先进行脸部检测,可以大大缩小眼睛检测的范围。从而提高人眼检测速度。
图像的区域操作同样使用numpy

# 将图像的一个区域复制到另一个区域>>> roi = img[280:340, 330:390]>>> img[273:333, 100:160] = roi
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

图像分割与合并

>>> b,g,r = cv2.split(img)>>> img = cv2.merge((b,g,r))#切片操作>>> b = img[:,:,0]>>> img[:,:,2] = 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

cv2.split()函数是一个耗时操作,谨慎使用。

画图像边框

cv2.copyMakeBorder()函数用于为图像画边框 ,函数的参数说明如下:

  • src - input image
  • top, bottom, left, right - border width in number of pixels in corresponding directions
  • borderType - Flag defining what kind of border to be added. It can be following types:
    • cv2.BORDER_CONSTANT - Adds a constant colored border. The value should be given as next argument.
    • cv2.BORDER_REFLECT - Border will be mirror reflection of the border elements, like this : fedcba|abcdefgh|hgfedcb
    • cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT - Same as above, but with a slight change, like this : gfedcb|abcdefgh|gfedcba
    • cv2.BORDER_REPLICATE - Last element is replicated throughout, like this: aaaaaa|abcdefgh|hhhhhhh
    • cv2.BORDER_WRAP - Can’t explain, it will look like this : cdefgh|abcdefgh|abcdefg
  • value - Color of border if border type is cv2.BORDER_CONSTANT
import cv2import numpy as npfrom matplotlib import pyplot as pltBLUE = [255,0,0]img1 = cv2.imread('opencv_logo.png')replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

以上操作后画出的边框示例如下:

图像的数学操作

主要学习 cv2.add(), cv2.addWeighted()两个函数

图像叠加

numpy相加为取模计算
opecv的add函数为饱和计算

>>> x = np.uint8([250])>>> y = np.uint8([10])>>> print cv2.add(x,y) # 250+10 = 260 => 255[[255]]>>> print x+y # 250+10 = 260 % 256 = 4[4]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

图像融合

图像的融合公式:g(x) = (1-a)f0(x) + af1(x);a的取值范围是0—1;
cv2.addWeighted()函数的图像融合:g(x) = (1-a)f0(x) + af1(x) + b

img1 = cv2.imread('ml.png')img2 = cv2.imread('opencv_logo.jpg')dst = cv2.addWeighted(img1,0.7,img2,0.3,0)cv2.imshow('dst',dst)cv2.waitKey(0)cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

融合图像示例:

图像位操作

图像位操作主要包括:AND、OR、 NOT、 XOR

# Load two imagesimg1 = cv2.imread('messi5.jpg')img2 = cv2.imread('opencv_logo.png')# I want to put logo on top-left corner, So I create a ROIrows,cols,channels = img2.shaperoi = img1[0:rows, 0:cols ]# Now create a mask of logo and create its inverse mask alsoimg2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)mask_inv = cv2.bitwise_not(mask)# Now black-out the area of logo in ROIimg1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)# Take only region of logo from logo image.img2_fg = cv2.bitwise_and(img2,img2,mask = mask)# Put logo in ROI and modify the main imagedst = cv2.add(img1_bg,img2_fg)img1[0:rows, 0:cols ] = dstcv2.imshow('res',img1)cv2.waitKey(0)cv2.destroyAllWindows()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

位操作后图像示例:

Python OpenCV代码检测与速度优化

  • cv2.getTickCount:获得当前的时钟tick数
  • cv2.getTickFrequency:获得时钟频率,即每秒的tick数
img1 = cv2.imread('messi5.jpg')e1 = cv2.getTickCount()for i in xrange(5,49,2):    img1 = cv2.medianBlur(img1,i)e2 = cv2.getTickCount()t = (e2 - e1)/cv2.getTickFrequency()print t# Result I got is 0.521107655 seconds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • cv2.useOptimized():检测是否开启优化
  • cv2.setUseOptimized():设置是否优化
# check if optimization is enabledIn [5]: cv2.useOptimized()Out[5]: TrueIn [6]: %timeit res = cv2.medianBlur(img,49)10 loops, best of 3: 34.9 ms per loop# Disable itIn [7]: cv2.setUseOptimized(False)In [8]: cv2.useOptimized()Out[8]: FalseIn [9]: %timeit res = cv2.medianBlur(img,49)10 loops, best of 3: 64.1 ms per loop

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

本篇比较麻烦的就是位操作了,分析好久,还没完全弄明白;有待更新。

(0)

相关推荐

  • 常见的图像处理技术

    重磅干货,第一时间送达 本期文章中,让我们一起来学习以下内容. 通过PIL和OpenCV来使用一些常见的图像处理技术,例如将RGB图像转换为灰度图像.旋转图像.对图像进行消噪.检测图像中的边缘以及裁剪 ...

  • OpenCV-Python在一个窗口中显示多幅图像

    在使用opencv显示图像时,有时候需要显示多张图像,就会出现多个窗口,显得冗余,用户不易观看.这时候就想着能不能将这些图像在一个窗口中显示.本文将介绍两种方法去实现. 方法1:创建空画布,将所有图像 ...

  • python+opencv图像处理(十四)

    图像直方图 1.灰度图像的直方图 灰度图像的直方图是灰度级和这种灰度级的概率之间关系的图形. 直接看图,下图中左侧是原图,右图为其直方图. 完整代码如下: import cv2 as cv impor ...

  • python+opencv图像处理(十二)

    图像仿射变换和透视变换 天晴了...... 1.仿射变换 图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形. 要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要 ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • 在 Google Colab 中使用 OpenCV 进行图像处理简介

    重磅干货,第一时间送达 在这篇文章中,我们将实现如何使用 OpenCV 在 google colaboratory 中进行图像处理.为此,我们应该了解一些 Python 基础知识,下面给出的步骤将帮助 ...

  • 使用 OpenCV 将卷积实现为图像过滤器

    卷积简介 卷积是计算机视觉 (CV) 中的一个流行术语.在讨论如何实现 CV 任务时,经常会提到卷积神经网络.因此,任何 CV 追求者都必须完全理解"卷积"一词. 卷积是几个图像处 ...

  • OpenCV-Python学习教程.2

    如果你用Linux得设备,可能会用到这里来看有没有设备被安全挂载.因为没有一个图形化的页面来方便的查看. 子Linux不是太好使 # 获取视频帧的宽w = fcap.get(cv2.CAP_PROP_ ...

  • 基于OpenCV的实用图像处理操作

    重磅干货,第一时间送达 图像处理适用于图像和视频.良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等.今 ...

  • python进阶—OpenCV之图像处理(一)

    文章目录 颜色空间转换 RGB色彩空间 HSV色彩空间 YUV色彩空间 简单的物体跟踪示例 HSV空间目标阈值选取 图像几何变换 图像的缩放 图像的位移 图像的旋转 图像的仿射 图像的投射 图像阈值( ...

  • python进阶—OpenCV之常用图像操作函数说明

    文章目录 cv2.threshold cv2.bitwise_and cv2.bitwise_or cv2.bitwise_not cv2.inRange cv2.resize cv2.adaptiv ...

  • Python进阶——OpenCV之GUI

    文章目录 图像处理(Getting Started with Images) 读取图像 显示图像 保存图像 使用Matplotlib 视频处理(Getting Started with Videos) ...

  • Python进阶系列:Python遍历的秘密

    前言 可迭代对象,迭代器,生成器,相信许多学习Python的小伙伴或多或少都听说过,但你真的知道他们的区别吗?真的知道为什么需要这些概念吗? 本文带你深入了解一系列相关机制,不仅告诉你概念,还告诉你为 ...

  • 【视频课】8大真实金融工程案例,20多小时Python进阶课推荐给你学习!

    Python是金融行业的重要工具,本次我们联合<王的机器>公众号号主一起推出Python金融案例进阶课程,并且基于8大金融行业的实际案例进行实践,下面请听介绍. 作者介绍 首先来介绍一下视 ...

  • 课件4——Python进阶

    Python猜数小游戏[游戏规则]生成一个指定范围的随机数(如:1-100),然后玩家输入数值猜答案,屏幕会根据玩家输入的数字给出大小提示,一直到玩家猜出准确答案则游戏胜利并结束.import  ra ...

  • Python进阶:探秘描述符的工作原理

    作者:Magic Kaito 来源:水滴与银弹 在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员并不了解它的原理. 但作为熟练使用 Python,想 ...

  • Python进阶之NumPy快速入门(一)在里面输入conda install numpy命令

    (在里面输入conda install numpy命令) https://m.toutiao.com/is/JT3FDcW/ 前言 NumPy是Python的一个扩展库,负责数组和矩阵运行.相较于传统 ...

  • Python进阶:切片的误区与高级用法

    众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术 ...