Python opencv图像处理基础总结(一)
学过的知识,会过时、会遗忘,但在努力过程中学会的处事态度和做事习惯,都会留在骨子里,变成我们的一部分。
Open Source Computer Vision Library,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1. 环境搭建:
pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install opencv-contrib-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
安装opencv的扩展模块
2. 读取并显示图片
import cv2 as cv
def get_image_info(image):
print(type(image)) # <class 'numpy.ndarray'>
print(image.shape) # 高度 宽度 通道数
print(image.size) # 像素大小
print(image.dtype) # 数据类型
src = cv.imread(r'D:pythonpycharm2020test 04.jpg')
cv.imshow("input image", src)
get_image_info(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下:
<class 'numpy.ndarray'>
(500, 500, 3)
750000
uint8
3. 读取视频和调用本地摄像头
import cv2 as cv
def read_video():
cap = cv.VideoCapture(r'D:beautyvideotest.mp4')
while True:
ret, frame = cap.read()
if ret == False:
break
cv.imshow('video', frame)
cv.waitKey(20)
read_video()
import cv2 as cv
# 调用笔记本内置镜头
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
while True:
ret, frame = cap.read()
frame = cv.flip(frame, 1)
cv.imshow('video', frame) # 显示镜头捕获的每一帧
if cv.waitKey(100) & 0xff == ord('q'): # 按q退出
break
cap.release()
cv.destroyAllWindows()
释放摄像头对象时错误:
SourceReaderCB::~SourceReaderCB terminating async callback
解决方法:
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
4. 色彩空间转换API的调用
import cv2 as cv
def color_space_transform(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('gray', gray)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
cv.imshow('hsv', hsv)
hls = cv.cvtColor(img, cv.COLOR_BGR2HLS)
cv.imshow('hls', hls)
YCrCb = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)
cv.imshow('YCrCb', YCrCb)
yuv = cv.cvtColor(img, cv.COLOR_BGR2YUV)
cv.imshow('yuv', yuv)
src = cv.imread(r'D:pythonpycharm2020test 04.jpg')
src = cv.resize(src, None, fx=0.5, fy=0.5)
cv.imshow('src', src)
color_space_transform(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
5. InRage函数的使用,追踪特定颜色
函数的参数意义:第一个参数为原数组,可以为单通道,多通道。第二个参数为下界,第三个参数为上界
mask = cv2.inRange(hsv, lower_blue, upper_blue)
- 第一个参数:hsv指的是原图(原始图像矩阵)
- 第二个参数:lower_blue指的是图像中低于这个lower_blue的值,图像值变为0
- 第三个参数:upper_blue指的是图像中高于这个upper_blue的值,图像值变为0(0代表黑色)
而在lower_blue~upper_blue之间的值变成255 (255代表白色)
即:opencv的inRange函数可提取特定颜色,使特定颜色变为白色,其他颜色变为黑色,从而实现图像的二值化处理。
HSV颜色对应的RGB分量范围表如下:(这里是三通道的)
测试所用图像如下:
追踪绿色,代码如下:
import cv2 as cv
import numpy as np
def tracking_colors(image):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
# 追踪绿色
lower_hsv = np.array([35, 43, 46])
upper_hsv = np.array([77, 255, 255])
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
cv.imshow('mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()
src = cv.imread(r'D:pythonpycharm2020test 01.jpg')
tracking_colors(src)
运行效果如下:
追踪蓝色,代码如下:
import cv2 as cv
import numpy as np
def tracking_colors(image):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
# 追踪蓝色
lower_hsv = np.array([100, 43, 46])
upper_hsv = np.array([124, 255, 255])
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
cv.imshow('mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()
src = cv.imread(r'D:pythonpycharm2020test 01.jpg')
tracking_colors(src)
运行效果如下:
通道分离与合并
import cv2 as cv
src = cv.imread(r'D:pythonpycharm2020test 04.jpg')
src = cv.resize(src, None, fx=0.5, fy=0.5)
b, g, r = cv.split(src) # 分离
cv.imshow('blue', b)
cv.imshow('green', g)
cv.imshow('red', r)
cv.imshow('src', src)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
import cv2 as cv
src = cv.imread(r'D:pythonpycharm2020test 04.jpg')
b, g, r = cv.split(src)
src[:, :, 2] = 0 # 修改了的图片
cv.imshow('changed src', src)
src1 = cv.merge((b, g, r)) # 合并得到原来的图片
cv.imshow('merged src', src1)
cv.waitKey(0)
运行效果如下:
6. 像素运算
算数运算:
像素的算术运算涉及加减乘除等基本运算(要进行算术运算,两张图片的shape必须一样)
实例如下:
import cv2 as cv
def add_demo(m1, m2): # 像素的加运算
dst = cv.add(m1, m2)
cv.imshow("add_demo", dst)
def subtract_demo(m1, m2): # 像素的减运算
dst = cv.subtract(m1, m2)
cv.imshow("subtract_demo", dst)
def divide_demo(m1, m2): # 像素的除法运算
dst = cv.divide(m1, m2)
cv.imshow("divide_demo", dst)
def multiply_demo(m1, m2): # 像素的乘法运算
dst = cv.multiply(m1, m2)
cv.imshow("multiply_demo", dst)
src1 = cv.imread(r'D:pythonpycharm2020test 07.png')
src2 = cv.imread(r'D:pythonpycharm2020test 08.png')
cv.imshow('image1', src1)
cv.imshow('image2', src2)
# 像素的算术运算(加、减、乘、除) 两张图片必须shape一致
add_demo(src1, src2)
subtract_demo(src1, src2)
divide_demo(src1, src1)
multiply_demo(src1, src2)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
像素的逻辑运算:
像素的逻辑运算涉及与、或、非、异或等基本运算(要进行逻辑运算,两张图片的shape必须一样)
实例如下:
import cv2 as cv
def and_demo(m1, m2): # 与运算 每个像素点每个通道的值按位与
dst = cv.bitwise_and(m1, m2)
cv.imshow("and_demo", dst)
def or_demo(m1, m2): # 或运算 每个像素点每个通道的值按位或
dst = cv.bitwise_or(m1, m2)
cv.imshow("or_demo", dst)
def not_demo(m1): # 非运算 每个像素点每个通道的值按位取反
dst = cv.bitwise_not(m1)
cv.imshow("not_demo", dst)
src1 = cv.imread(r'D:pythonpycharm2020test 07.png')
src2 = cv.imread(r'D:pythonpycharm2020test 08.png')
cv.imshow('image1', src1)
cv.imshow('image2', src2)
# 像素的逻辑运算(与、或、非) 两张图片必须shape一致
and_demo(src1, src2)
or_demo(src1, src2)
not_demo(src1)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
调节图片对比度和亮度:
简单测试如下:
import cv2 as cv
import numpy as np
def adjust_brightness_image(image, c, b): # 第2个参数rario为对比度 第3个参数b为亮度
height, width, channels = image.shape
blank = np.zeros([height, width, channels], image.dtype) # 新建的一张全黑图片和img1图片shape类型一样,元素类型也一样
dst = cv.addWeighted(image, c, blank, 1 - c, b)
cv.imshow("adjust_contrast_brightness", dst)
src = cv.imread(r'D:pythonpycharm2020test 04.jpg')
cv.imshow("first", src)
# 调节图片对比度和亮度 contrast and brightness (1.2, 100) (2.5, 0) (0.5 10)
adjust_brightness_image(src, 1.2, 100)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。
- Go语言轻量级线程Goroutine用法实例
- 仿异次元百度分享工具条张戈修改版
- Go语言的队列和堆栈实现方法
- 妹子你真萌:一次心惊肉跳的服务器误删文件的恢复过程
- Go语言使用sort包对任意类型元素的集合进行排序的方法
- Oracle 12c ASM专题|Flex Diskgroup相关概念
- 移动搜索SEO分享:利用Meta声明来做百度开放适配
- 百度分享无法抓取图片及摘要的折中解决办法
- Golang 持久化
- Golang context 包入门
- 动手实现一个JSON验证器(上)
- Go语言实现冒泡和快速排序
- 利用Meta申明来做百度、谷歌、雅虎、微软等搜索的开放适配
- 【Oracle 12c ASM专题】——我的第一个Flex Diskgroup
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Binary Search - 378. Kth Smallest Element in a Sorted Matrix
- Array - 59. Spiral Matrix II
- Array - 54. Spiral Matrix
- String - 8. String to Integer (atoi)
- Array - 16. 3Sum Closest
- Array - 15. 3Sum
- Design - 146. LRU Cache
- LinkedList - 142. Linked List Cycle II
- LinkedList - 2. Add Two Numbers
- Array - 56. Merge Intervals
- golang 内存分析/内存泄漏
- golang gctrace分析gc过程
- golang 标准库 time/rate 介绍
- golang map的并发读写导致panic
- 正则表达式