专栏首页Python进阶之路Python opencv图像处理基础总结(一)

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:\python\pycharm2020\test\004.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:\beauty\video\test.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:\python\pycharm2020\test\004.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:\python\pycharm2020\test\001.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:\python\pycharm2020\test\001.jpg')
tracking_colors(src)

运行效果如下:

通道分离与合并

import cv2 as cv


src = cv.imread(r'D:\python\pycharm2020\test\004.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:\python\pycharm2020\test\004.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:\python\pycharm2020\test\007.png')
src2 = cv.imread(r'D:\python\pycharm2020\test\008.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:\python\pycharm2020\test\007.png')
src2 = cv.imread(r'D:\python\pycharm2020\test\008.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:\python\pycharm2020\test\004.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()

运行效果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python opencv+pytesseract 验证码识别

    识别验证码,需要先对图像进行预处理,去除会影响识别准确度的线条或噪点,提高识别准确度。

    叶庭云
  • Python opencv图像处理基础总结(四) 模板匹配 图像二值化

    模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方...

    叶庭云
  • Python opencv图像处理基础总结(三) 图像直方图 直方图应用 直方图反向投影

    图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个...

    叶庭云
  • canvas封闭状态及状态恢复

    使用context.save()会保存当前的线条颜色,宽度属性,进行多次保存,使用context.restore()恢复离之最近之前的状态,

    十月梦想
  • 机器视觉算法(第10期)----图像处理中64个常用的算子

    上期我们一起学习了OpenCV中最重要的数据类型数组Mat类, 机器视觉算法(第9期)----OpenCV中最最最重要的类型 从今天我们仍将以OpenCV为工具...

    智能算法
  • OpenCV系列之轮廓特征 | 二十二

    特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等。请查看特征矩上的维基百科页面。函数cv.moments()提供了所有计算出的矩值的字典。见下文:

    磐创AI
  • 基于python图像处理API的使用示例

    常用的图像处理技术有图像读取,写入,绘图,图像色彩空间转换,图像几何变换,图像形态学,图像梯度,图像边缘检测,图像轮廓,图像分割,图像去噪,图像加水印以及修复水...

    砸漏
  • 二值分析 | OpenCV + skimage如何提取中心线

    显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage...

    OpenCV学堂
  • OpenCV学习+常用函数记录④:形态学、模板匹配和运动检测

    形态学变化是基于图像形状的一些简单操作。操作对象一般是二值图像,需要两个输入,一个是输入图像,另一个是3x3的结构元素(内核),决定了膨胀操作的本质。常见的操作...

    小黑鸭
  • OpenCV二值图像分析之寻找缺失与靶心

    大家好,今天给大家分享两个来自OpenCV研习社提问的帖子,都是很经典的图像处理与分析问题,希望通过这两个例子,大家能够得到更多的启发,从而想到更好的解决类似问...

    OpenCV学堂

扫码关注云+社区

领取腾讯云代金券