openCV学习1——基础速成

目录

一、环境配置:

二、基本知识

1.导入包

入门就用到这两个包,因为我们在读取一个图像时,用来存储图像的变量的数据类型就是numpy

2.导入图像

3.图像的展示

4.灰度图的读取

 5.图像的裁剪

6.画布创建以及简单图形绘制

7.滤波器

8.图像特征提取

9.模版匹配

10.梯度算法 反映图像的明暗变化

11.(重要)阈值算法(二值化算法)

12.形态学算法

13.调用电脑中摄像头

前言:

因为上课要用,鼠鼠甚至python 0基础,所以这篇文章不会对一些Python语法做过多解释

每一个板块我基本传的完整代码,不懂是什么效果的话,直接去IDE里运行一下

目标:改参数能用就行(

一、环境配置:

鼠鼠用的vscode + anaconda,所以直接pip install了一个,详细教程B站都有

二、基本知识

1.导入包

入门就用到这两个包,因为我们在读取一个图像时,用来存储图像的变量的数据类型就是numpy

import cv2
import numpy as np

2.导入图像

##这里注意放图片路径
image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\1732070889305.jpg")
 ##读取图片数,是numpy数组类型
print(image.shape) ##打印图片三个维度,横 纵 彩色通道

3.图像的展示

imshow()函数:第一个参数是窗口名,第二个传 存储要展示的图的变量

#展示 (窗口名,变量名)
cv2.imshow("image",image)
##这样窗口会一闪而过,需要加上下面的代码
cv2.waitKey()
#输入任意键,程序会结束

4.灰度图的读取

注意:opencv存储一张彩色图 = 存储三张灰度图, 颜色存储顺序是 B G R 对应颜色通道 0 1 2

方法一:读取原图再进行转化分解

import cv2

image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg")

##读取三原色的灰度图
cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])

##彩色图像的灰度变换算法:将三个彩色通道的图像做平方和,加权平均
##图像处理领域,称变换后的图像为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)

cv2.waitKey()

方法二:直接读取灰度图

就是读取时多传了一个参数,这个参数不止一个,用到再查

gary = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg",cv2.IMREAD_GRAYSCALE)

 5.图像的裁剪

import cv2

image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg")

##裁剪,第一个参数是行,第二个参数是列
##不同包的参数顺序可能不同
crop = image[50:500,50:400]

cv2.imshow("crop",crop)
cv2.waitKey()

6.画布创建以及简单图形绘制

import cv2
import numpy as np ##存储的图像就是numpy数据结构,所以可以直接创建黑色画布
##第一个参数是图像的三维,第二个参数代表灰度的数值类型,这里给的是无符号8位整数u int 8
image = np.zeros([300,300,3], dtype=np.uint8)

##画一个线段 参数分别代表:传入图像 起点坐标 终点坐标 线段颜色 线段粗细
cv2.line(image,(100,200),(250,250),(255,0,0),2)
##画一个矩形框 参数:传入图像 第一个顶点坐标 对角顶点坐标 颜色 粗细
cv2.rectangle(image,(30,100),(250,250),(0,255,0),2)
##画一个圆 中心 半径 颜色 粗细
cv2.circle(image,(150,150),20,(0,0,255),3)
##绘制字符串 字符串 坐标 字体序号 缩放系数 颜色 粗细 线条类型
##这个东西局限性很大,用不了中文
cv2.putText(image,"wjyswe",(100,50),0,1,(255,255,255),2,1)

cv2.imshow("image",image)
cv2.waitKey()

7.滤波器

import cv2
##均值滤波器
image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg")

##高斯内核设置5像素  0表示由内核大小决定
gauss = cv2.GaussianBlur(image,(5,5),0)
cv2.imshow("image",image)
cv2.imshow("gauss",gauss)

##中值滤波器 设置内核为5像素
median = cv2.medianBlur(image,5)
cv2.imshow("median",median)

cv2.waitKey()

8.图像特征提取

识别出来的特征都是图像的转角

import cv2

image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) ##转化为灰度图

##获取图像中的特征点 最多返回500个点 点的质量优于0.1 特征点之间距离大于10个像素
corners = cv2.goodFeaturesToTrack(gray,500,0.1,10)
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(image,(int(x),int(y)),3,(255,0,255),-1)

cv2.imshow("corners",image)
cv2.waitKey()

9.模版匹配

就是先划出图像中的一个图形,比如菱形,然后就会去搜索所有的菱形

import cv2
import numpy as np

image = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\puke.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

##选择一个区域作为匹配模版 这个区域刚好包含菱形 [横 纵]
template = gray[76:147,310:361]
##存储待检测图像 最后那个是标准相关匹配算法  就是两个图都标准化再比较
match = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
locations = np.where(match >= 0.9) ##找出匹配程度大于0.9的匹配点

##求出高度和宽度
h,w = template.shape[0:2]
##遍历画出矩形框
for p in zip(*locations[::-1]):
    x1,y1 = p[0], p[1]
    x2,y2 = x1 + w, y1 + h
    cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,255),2)

cv2.imshow("image",image)
cv2.waitKey()

10.梯度算法 反映图像的明暗变化

import cv2
##直接读取灰度图
gary = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg",cv2.IMREAD_GRAYSCALE)

##拉普拉斯算子 大致等于原图的二阶导数
laplacian = cv2.Laplacian(gary,cv2.CV_64F) ##这求出来的图有、掉san
##canny边缘检测 用区间检测边缘 >200 是边缘 <100 不是  区间内,要判断是否和已知的边缘像素相连,如果相邻就是
canny = cv2.Canny(gary,100,200) ##这个效果好

cv2.imshow("gary",gary)
##cv2.imshow("laplacian",laplacian)
cv2.imshow("laplacian",canny) 
##给出了图像的明暗变化趋势,因为图形的几何边缘有剧烈的明暗变化,所以常用于检测图像边缘
cv2.waitKey()

11.(重要)阈值算法(二值化算法)

就是根据一个阈值,将图片分成只有两个灰度,假如a > b > c,那么>b的都会是a,反之是c

import cv2
##直接读取灰度图
gray = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg",cv2.IMREAD_GRAYSCALE)

##阈值为10 最大灰度为255
ret, binary = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
##对不同区域采用不同阈值,这里是一种自适应阈值算法
##区域大小为115个像素
binary_adative = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)
##常用算法 大金算法,小日子发明的
##不需要人为计算阈值,会自动计算
ret1, binary_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("gary",gray)
cv2.imshow("binary",binary)
cv2.imshow("adaptive",binary_adative)
cv2.imshow("binary_otsu",binary_otsu)

cv2.waitKey()

12.形态学算法

 这里我们主要学习“腐蚀”和“膨胀” (变粗和变细),能使棱角尖锐(光滑)

import cv2
import numpy as np

gray = cv2.imread("D:\My_study_resoure\opencv_study\\test2\\funingna.jpg",cv2.IMREAD_GRAYSCALE)
##操作要基于二值化图像,先做阈值处理

ret1, binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8) ##5x5像素的正方形

##用kernel腐蚀图像
erosion = cv2.erode(binary,kernel) ##腐蚀
dilation = cv2.dilate(binary,kernel) ##膨胀
cv2.imshow("binary",binary)
cv2.imshow("erosion",erosion)
cv2.imshow("dilation",dilation) 

cv2.waitKey()

13.调用电脑中摄像头

笔记本注意打开摄像头,摄像头序号要去自己看,如果只有一个摄像头就是0

import cv2
##要传入摄像头的序号 只有一个摄像头,就填入0
capture = cv2.VideoCapture(0)

##每次只传一帧,所以要循环读取
##写成死循环
while True:
    ret, frame = capture.read() ##读取画面
    cv2.imshow("camera",frame)  ##展示
    key = cv2.waitKey(1) ##等待1ms
    if key != -1:
        break

capture.release() ##释放指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值