opencv常用函数

OpenCV图像处理

本篇主要是讲解OpenCV中一些常用的函数。

一、OpenCV介绍

  • OpenCV于1999年由Intel建立;
  • 开源发行的跨平台计算机视觉库;
  • 操作系统:Linux、Windows、Android、Mac OS;
  • 构成:C函数和少量C++类;
  • 接口:Python、Java、MATLAB等语言
  • opencv是数字图像处理和计算机视觉领域最常见的工具包,是学习,科研,企业项目开发的好帮手。
  • 安装:pip install contrib-python

二、基本操作

2.1 读入图像

函数:cv2.imread()
参数说明:
参数1:待读图片路径;
参数2:读取方式,常见方式有3种:

读取方式含义数字表示
cv2.IMREAD_COLOR默认值,加载一张彩色图片,忽视透明度。1
cv2.IMREAD_GRAYSCALE加载一张灰度图。0
cv2.IMREAD_UNCHANGED加载图像,包括它的Alpha通道。-1
# 导入opencv的python版本的依赖库cv2
import cv2

# 使用opencv中imread函数读取图片
# 0代表灰度图打开,1代表彩色图形式打开
img = cv2.imread('lena.jpg', 0)
print(img.shape)

2.2 显示图像及保存

函数:cv2.imshow()
参数说明:
参数1:窗口的名字;
参数2:图像数据名。

函数:cv2.imwrite()
参数说明:
参数1:图像名(包括格式);
参数2:待写入的图像数据变量名。

import cv2

# 读取图像,读取方式为彩色读取
img = cv2.imread('images/split.jpg', 1)

# 调用imshow()函数进行图像显示
cv2.imshow('photo', img)

# cv2.waitKey()是一个键盘绑定函数,
# 单位毫秒,0代表等待键盘输入。
k = cv2.waitKey(0)

if k == 27: # 输入ESC键退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 输入s键保存并退出
    cv2.imwrite('images/split_.jpg', img)
    print('图片保存成功!')
    
# cv2.destroyAllWindows() 删除窗口
# 默认值为所有窗口,参数为待删除窗口名
cv2.destroyAllWindows()

2.3 通道转化

2.3.1 灰度转化
  • 目的:
    将三通道图像(彩色图)转化为单通道图像(灰度图)。

  • 公式:
    3–>1:GRAY = B * 0.114 + G * 0.587 + R * 0.299
    1–>3:R = G = B = GRAY; A = 0

  • 函数:cv2.cvtColor(img, flag)

  • 参数说明:
    参数1:待转化图像;
    参数2:flag就是转换模式,
    cv2.COLOR_BGR2GRAY:彩色转灰度
    cv2.COLOR_GRAY2BGR:单通道转三通道

import cv2
# 读入原始图像,用cv2.IMREAD_UNCHANGED
img = cv2.imread('images/lena.jpg', cv2.IMREAD_UNCHANGED)
# 查看打印图像的shape
shape = img.shape
print(shape)
# 判断通道数是否为3通道或4通道
if shape[2] == 3 or shape[2] == 4:
    # 将彩色图转化为单通道图
    # img:图像变量,cv2.COLOR_BGR2GRAY:转化模式
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray_image', img_gray)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3.2 BGR与RGB转化
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('images/lena.jpg', 1)
cv2.imshow('Opencv_win', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 用opencv自带的方法转
img_cv_method = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 用numpy转
img_numpy_method = img[:, :, ::-1] # 本来是BGR,现在逆序,变成RGB
# 用matplot画图
plt.subplot(1, 2, 1)
plt.imshow(img_cv_method)
plt.subplot(1, 2, 2)
plt.imshow(img_numpy_method)
plt.savefig('./images/plt.png')
plt.show()
# 保存图片
cv2.imwrite('./images/opencv.png', img)
  • OpenCV采用BGR读图方式的原因:
      OpenCV在1999年由Intel建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,另外对于图片,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图BMP的格式就是BGR。正是基于BGR在当时被广泛使用,于是早期OpenCV开发者就选择BGR颜色格式,这也就成为了一种规范一直用到现在。(https://blog.csdn.net/hacker_long/article/details/88430559)
2.3.3 通道分离
  • 目的:
    将彩色图像,分成b、g、r 3个单通道图像。方便我们对BGR三个通道分别进行操作。

  • 函数:cv2.split(img)

  • 参数说明:
    参数1:待分离通道的图像

import cv2
src = cv2.imread('images/split.jpg')
cv2.imshow('before', src)
# 调用通道分离
b, g, r = cv2.split(src)
# 三通道分别显示
cv2.imshow('blue', b)
cv2.imshow('green', g)
cv2.imshow('red', r)
cv2.waitKey(0)
cv2.destroyAllWindows()

直接显示分离通道

跟想象中的不太一样吧?要想显示彩色图像,必须是三通道,所以,可以给其它通道设为0值再进行接下来要讲的通道合并。

import numpy as np
import cv2

image = cv2.imread('images/split.jpg')
cv2.imshow('src', image)
cv2.waitKey(0)
B, G, R = cv2.split(image)

zeros = np.zeros(image.shape[:2], dtype='uint8') # 创建与image相同大小的零矩阵
cv2.imshow('BLUE', cv2.merge([B, zeros, zeros])) # 显示(B,0, 0)图像
cv2.imshow('GREEN', cv2.merge([zeros, G, zeros])) # 显示(0, G, 0)图像
cv2.imshow('RED', cv2.merge([zeros, zeros, R])) # 显示(0, 0, R)图像
cv2.waitKey(0)
cv2.destroyAllWindows()

OK了
在这里插入图片描述

2.3.4 通道合并
  • 目的:
    通道分离为B、G、R后,对通道单独进行修改,最后将修改后的三通道合并为彩色图像。

  • 函数:cv2.merge(List)

  • 参数说明:
    参数1:待合并的通道数,以list的形式输入

import cv2
src = cv2.imread('images/lena.jpg')
cv2.imshow('before', src)
# 调用通道分离
b, g, r = cv2.split(src)
# 将Blue通道数改为0
b[:] = 0
# 合并修改后的通道
img_merge = cv2.merge([b, g, r])
cv2.imshow('merge', img_merge)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2.4 图像直方图

  图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。

  • 意义:

    • 直方图是图像中像素强度分布的图形表达方式;
    • 统计了每一个强度值所具有的像素个数
    • CV领域常借助图像直方图来实现图像的二值化
  • 目的:
    直方图是对图像像素的统计分布,它统计了每个像素(0到255)的数量。

  • 函数:cv2.calcHist(images, channels, mask, histSize, range)

  • 参数说明
    参数1:待统计图像,需要用中括号括起来;
    参数2:待计算的通道;
    参数3:Mask,这里没有使用,所以用None;
    参数4:histSize,表示直方图分成多少份;
    参数5:是表示直方图中各个像素的值,[0, 256]表示直方图能表示像素值从0到256的像素。直方图是对图像像素的统计分布,它统计了每个像素(0到255)的数量。

直方图绘制

from matplotlib import pyplot as plt
import cv2
import numpy as np

img = cv2.imread('images/lena.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.imshow(img_gray, cmap=plt.cm.gray)
# [img]:图像,[0]:通道数,None:mask,[256]:份数,[0, 256]:灰度值范围
hist = cv2.calcHist([img], [0], None, [256], [0, 256])

plt.figure()
plt.title('Grayscale Histogram')
plt.xlabel('Bins')
plt.ylabel('# of Pixels')
plt.plot(hist)
plt.xlim([0, 256])
plt.show()

在这里插入图片描述
三通道直方图绘制

from matplotlib import pyplot as plt
import cv2

girl = cv2.imread('images/lena.jpg')
cv2.imshow('girl', girl)
color = ('b', 'g', 'r')
# 使用for循环遍历color列表,enumerate枚举返回索引和值
for i, color in enumerate(color):
    hist = cv2.calcHist([girl], [i], None, [256], [0, 256])
    plt.title('girl')
    plt.xlabel('Bins')
    plt.ylabel('num of perlex')
    plt.plot(hist, color=color)
    plt.xlim([0, 256])

plt.show()
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值