文章由来:个人学习笔记,笔记内容包括原视频代码、老师讲解和个人补充查阅
原教程视频:https://www.bilibili.com/video/BV1BT4y1Z7WS/
原视频下有老师的代码分享,视频纯干货(太干了),本人分享笔记出于个人的查阅和补充以及个人学习经历的分享
文章适用情景:适合初学OpenCV图像处理,使用和回顾具体知识时方便查阅
前期准备:安装Python和OpenCV工具包(此处省略)
准备图片:链接:https://pan.baidu.com/s/18xWQofkNMRxN5J6oPWusOg?pwd=rldg 提取码:rldg
一、读取、显示图片
import cv2
print(cv2.getVersionString())
image = cv2.imread("opencv_logo.jpg") #使用opencv读取图片文件
print(image.shape) #打印图片的形状(高度,宽度,通道数)
#所有数字化的图片都是由像素网格构成的,所有的数字图像处理都是对像素进行数学运算
#把image读取到的数据显示在一个窗口
cv2.imshow("image",image) #(窗口名,变量名)
cv2.waitKey() #让窗口暂停并等待键盘输入(输入任意值后退出)
二、图形的彩色通道RGB
#图形的彩色通道RGB
import cv2
image = cv2.imread("opencv_logo.jpg")
#颜色通道顺序:BGR
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()
图像的彩色通道:计算机对于色彩的描述普遍使用了RGB三原色原理,任何颜色都是按RGB(红绿蓝)三种颜色按照一定比例混合而来。对于OpenCV来说,存储一张彩色图片等同意存储三张灰度图灰度范围是0到255,OpenCV对颜色的存储顺序是BGR(与常见的RGB顺序相反)当显示器需要渲染一张图片时,计算机会依次取出图像数据的三张灰度图,再把他们分别投影到显示器的LED芯片上从而渲染出彩色画面。
OpenCV提供一种彩色图像的灰度变换算法,可以把三个彩色通道的图像做平方和加权平均。
在计算机视觉领域,我们通常把处理之后的gray称为灰度图,大量的图像算法都是通过灰度图来操作的。
三、图像裁剪操作
import cv2
image = cv2.imread("opencv_logo.jpg")
crop = image[10:170,40:200]
"""
索引顺序:先横行后纵列
【第10行到170行,第40列到200列】
"""
cv2.imshow("crop",crop)
cv2.waitKey()
四、绘制直线、矩形、圆形
#绘制直线、矩形、圆形
import cv2
import numpy as np #OpenCV的图像数据实际是numpy数组数据结构
image = np.zeros([300,300,3],dtype=np.uint8)
cv2.line(image,(100,200),(250,250),(250,0,0),2)#直线
cv2.rectangle(image,(30,100),(60,150),(0,255,0),2)#矩形
cv2.circle(image,(150,100),20,(0,0,255),3)#圆形
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2,1)
#putText(图片,“文字”,(起点坐标),字体序号,缩放系数,(颜色),粗细,线条类型(实线))
cv2.imshow("image",image)
cv2.waitKey()
五、使用均值滤波器处理图片中的噪点
import cv2
image = cv2.imread("plane.jpg")
#高斯滤波器
gauss = cv2.GaussianBlur(image,(5, 5),0)
#中值滤波器
median = cv2.medianBlur(image,5)
cv2.imshow("image",image)
cv2.imshow("gauss",gauss)
cv2.imshow("median",median)
cv2.waitKey()
高斯滤波器: cv2.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] ) src –输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。 dst –输出与图像大小和类型相同的图像src。 ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同, 但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。 sigmaX – X方向上的高斯核标准偏差。 sigmaY – Y方向上的高斯核标准差;如果 sigmaY 为零,则将其设置为等于 sigmaX; 如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。 borderType –像素外推方法。
中值滤波器: dst=cv2.medianBlur(src,ksize) dst是返回值,表示进行中值滤波后得到的处理结果。 src 是需要处理的图像,即源图像。 ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,核大小必须是比1大的奇数,比如3、5、7等。
算法原理参考视频:https://www.bilibili.com/video/BV1F4411B7dW/
六、图像特征的提取
import cv2
image = cv2.imread("opencv_logo.jpg")#读取文件信息
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#将彩色图像转换为灰度图
#获取图像特征点(输入图像,最多获取特征点个数,图像角点的最小可接受参数(质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃),特征点之间的最小距离(单位像素))
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,255,0),-1)#用圆形在彩图上标记出这些角点(特征点)
cv2.imshow("corners",image)
cv2.waitKey()
七、模板匹配扑克牌上的菱形
import cv2
import numpy as np #数学基础库
image = cv2.imread("poker.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#灰度处理
template = gray[75:105,235:265] #选取样本
match = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
#cv2.TM_CCOEFF_NORMED 标准相关匹配算法,
# 把待检测图像和模板都各自标准化,再计算匹配度,防止光照等影响
locations = np.where(match >=0.9)#找出匹配系数大于0.9的点
w, h = 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, 0), 2)#画矩形(参考04)
cv2.imshow("image",image)
cv2.waitKey()
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。zip(*)函数利用 * 号操作符,可以将元组解压为列表。
八、图像梯度算法与边缘检测
import cv2
gray = cv2.imread("opencv_logo.jpg",cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(gray,cv2.CV_64F)
# Laplacian(拉普拉斯)算子是一种二阶导数算子,
# 其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。
canny = cv2.Canny(gray,100,200)
cv2.imshow("gray",gray)
cv2.imshow("laplacian",laplacian)
cv2.imshow("canny",canny)
cv2.waitKey()
九、图像的二值化
import cv2
gray = cv2.imread("bookpage.jpg",cv2.IMREAD_GRAYSCALE)
ret,binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)
#由于光照情况不同,文字图片处理可以把图片划分区域确定不同的阈值
binary_adaptive = 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("gray",gray)
cv2.imshow("binary",binary)
cv2.imshow("adaptive",binary_adaptive)
cv2.imshow("otsu",binary_otsu)
cv2.waitKey()
cv2.threshold(img, thresh, maxVal, cv2.xxx) 第一个参数是源图像,应该是灰度图; 第二个参数是对图像进行分类的阈值; 第三个参数是最大值,表示如果像素值大于(有时小于)阈值则要给出的值; 第四个参数决定给出不同类型的阈值。包括: - cv2.THRESH_BINARY - cv2.THRESH_BINARY_INV - cv2.THRESH_TRUNC - cv2.THRESH_TOZERO - cv2.THRESH_TOZERO_INV
十、形态学算法之腐蚀和膨胀
import cv2
import numpy as np
gray = cv2.imread("opencv_logo.jpg",cv2.IMREAD_GRAYSCALE)
_, binary = cv2.threshold(gray,200,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(binary, kernel)#腐蚀函数
dilation = cv2.dilate(binary,kernel)#膨胀函数
cv2.imshow("binary",binary)
cv2.imshow("erosion",erosion)
cv2.imshow("dilation",dilation)
cv2.waitKey()
十一、调用电脑摄像头
import cv2
capture = cv2.VideoCapture(0)#调用摄像头设备0(设备管理器中摄像头的第一个)
while True: #循环读取每一帧的画面
ret, frame = capture.read()
cv2.imshow("camera",frame)
key = cv2.waitKey(1) #1为参数,单位毫秒,表示间隔时间
if key != -1:
break
capture.release()#释放摄像头或视频文件资源
waitKey(int delay)键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入。如果delay大于0,那么超过delayms后,如果没有按键,那么会返回-1,如果按键那么会返回键盘值,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。
全部代码及图片:链接:https://pan.baidu.com/s/1aaAMeY_hCjnGHunCSXUH3Q?pwd=6tqx 提取码:6tqx