初识OpenCV


版本3.4.1

定义

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

基本操作

首先还是要将需要的库导入

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

读取图片

image = cv2.imread('图片路径')
image =cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

在这里插入图片描述
上面的操作就是读取并输出了一张图片.注意第二步操作,因为读取默认是以BGR格式读取的,所以输出颜色会有点奇怪,所以要转换成RGB格式.
打印图片

plt.imshow(image)
plt.axis('off')#打印时不显示坐标轴
plt.show()

先前我们定义了一个image,直接输出即可.
因为每一步输出图片都会用到读取和输出这个操作,所以我们将这个操作封装成一个函数方便使用

def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    
def imread(image):
    image = cv2.imread(image)
    image =cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image

下面演示的所有show函数都是用的这个封装好的函数

图片格式

print("height: %d" %(image.shape[0]))
print("width: %d" %(image.shape[1]))
print("channels: %d" %(image.shape[2]))
print(image.shape)
height: 353
width: 500
channels: 3
(353, 500, 3)

从这里我们可以得出格式是(高,宽,图片通道数(RGB)).

图片平移

M = np.float32([[1,0,100],[0,1,150]]) #1,0水平方向100  0,1竖直方向150,正号是往右,往下
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
show(shifted)

我们先定义了一个列表表示图片需要平移的方向和大小,1,0表示水平方向,0,1表示垂直方向,后面是图片平移的值,正数是图片向右/向下平移.
随后使用cv2.warpAffine(图片,平移方向大小,宽,高)实现平移.
在这里插入图片描述
图片旋转

(h,w) = image.shape[0:2]
(cX,cY) = (w/2,h/2) #中点
M = cv2.getRotationMatrix2D((cX,cY),45,0.5)#旋转中心点 45° 缩放
image = cv2.warpAffine(image,M,(w,h))
show(image)

在这里插入图片描述
首先定义旋转中点,使用cv.getRotationMatrix2D((中点坐标),旋转角度,缩放比率),再使用cv2.warpAffine(图像,旋转操作,(宽,高))

重置大小

width = 125
height = 120
image = cv2.resize(image,(width,height))
show(image)
print("shape:",image.shape)

在这里插入图片描述
shape:(120, 125, 3)
#resize比较简单,定义了宽和高,直接使用resize就可以了.

画图

image = np.zeros((300,300,3),dtype='uint8')
show(image)

在这里插入图片描述
定义了一张长宽均为300,三通道的图片.

green = (0,255,0)
blue = (0,0,255)
cv2.line(image,(0,0),(300,300),green)#直线起始位置,终止位置 颜色/粗细 为-1填充
cv2.line(image,(300,0),(150,150),blue,5)
show(image)

在这里插入图片描述
先定义一个绿色一个蓝色
再用cv2.line(图片,(起点位置坐标值),(重点位置坐标值),颜色,线条粗细)即可实现画线.

red = (255,0,0)
cv2.rectangle(image,(10,10),(60,60),red,2) #左上 右下
show(image)

在这里插入图片描述
在刚才的基础上,再画了一个一个红色的矩形.
cv2.rectangle(图像,(矩形左上角坐标点),(矩形右下角坐标点),颜色,线条粗细).

(cX,cY) = image.shape[1]//2,image.shape[0]//2
white=(255,255,255)
for r in range(0,151,15):
    cv2.circle(image,(cX,cY),r,white,2)
show(image)

在这里插入图片描述
先定义图片中心为圆心,这里用了一个循环去遍历半径的值,用cv2.circle(图片,(圆心作标),半径,颜色,线条粗细)即可实现画圆

图片翻转

image = cv2.flip(image,0)

在这里插入图片描述
翻转也很简单,用cv2.flip(图片,翻转方向)即可实现,翻转方向 0表示垂直翻转, 1表示水平翻转,-1是两个一起.
创建遮挡

image = imread('图片路径)
mask = np.zeros(image.shape,dtype='uint8')
white = (255,255,255)
cv2.circle(mask,(150,100),160,white,-1)
show(mask)

在这里插入图片描述
先画了一个圆.

masked = cv2.bitwise_and(image,mask)
show(masked)

在这里插入图片描述
cv2.bitwise_and()是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0

形态学

腐蚀

image = imread('路径')
show(image)

在这里插入图片描述
读入一张新的图片

腐蚀会把前景物体的边界腐蚀掉(但是前景仍然是白色)。卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
在这里插入图片描述

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
for i in range(2):
    erosion = cv2.erode(image,kernel,iterations=i+1)#腐蚀次数
    show(erosion)

在这里插入图片描述

先定义了一个(5,5)的滤波器,再进行两次腐蚀。
腐蚀的作用是减少对象大小像素、平滑对象边缘。直观感受就是变暗。
膨胀
在这里插入图片描述

dilation = cv2.dilate(image,kernel)#取局部最大
show(dilation)

在这里插入图片描述
膨胀的作用是增大对象大小像素、平滑对象边缘。直观来看就是亮度增加、变白。

可以将膨胀看作白色区域扩大、腐蚀看作黑色区域扩大。

开运算

opening = cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel)
show(opening)

在这里插入图片描述
先腐蚀、后膨胀 消除小白点。

闭运算

close = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
show(close)

在这里插入图片描述
先膨胀,后腐蚀,消除小黑点。

梯度

gradient = cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel)
show(gradient)

在这里插入图片描述
膨胀-腐蚀, 得出图片轮廓。

白帽

tophat = cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel)
show(tophat)

在这里插入图片描述
白帽 原图-开运算 显示去除的白色。

黑帽

tophat = cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel)
show(tophat)

在这里插入图片描述
原图-闭运算 显示去除的黑色。

以上为一些基本的OpenCV会使用到的操作,如有错误请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值