Opencv学习笔记(二)图像处理

这篇博客详细介绍了图像处理的各种技术,包括从灰度和HSV转换开始,深入到图像阈值设定、平滑滤波、形态学操作,再到图像梯度计算如Sobel和Laplacian算子,以及Canny边缘检测。还讨论了图像金字塔和轮廓检测,并提及了傅里叶变换在图像处理中的应用。这些技术对于图像分析和模式识别至关重要。
摘要由CSDN通过智能技术生成

0、导入模块

import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt#Matplotlib是RGB
import numpy as np 
%matplotlib inline 

1、灰度、HSV

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度化
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#H-色调,S-饱和度(纯色/颜色的阴影),V值(强度)

2、图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)

src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

3、图像平滑

blur=cv2.blur(img,(3,3))# 均值滤波,简单的平均卷积操作
box = cv2.boxFilter(img,-1,(3,3), normalize=True)#方框滤波,基本和均值一样,可以选择归一化
aussian = cv2.GaussianBlur(img, (5, 5), 1)# 高斯滤波,高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
median = cv2.medianBlur(img, 5)  # 中值滤波,相当于用中值代替

4、形态学

kernel=np.ones((3,3),np.uint8)
erosion=cv2.erode(img,kernel,iterations=1)#腐蚀操作
dige_dilate=cv2.dilate(img,kernel,iterations=1)#膨胀操作
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#开:先腐蚀,再膨胀
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭:先膨胀,再腐蚀
gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)# 梯度=膨胀-腐蚀
tophat= cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)#礼帽 = 原始输入-开运算结果
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)#黑帽 = 闭运算-原始输入

5、图像梯度

Sobel算子

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
ddepth:图像的深度
dx和dy分别表示水平和竖直方向
ksize是Sobel算子的大小

sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)# 白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值
sobely = cv2.convertScaleAbs(sobely)  
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#分别计算x和y,再求和

Scharr算子

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian算子

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

Canny边缘检测

使用高斯滤波器,以平滑图像,滤除噪声。
计算图像中每个像素点的梯度强度和方向。
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
通过抑制孤立的弱边缘最终完成边缘检测。
双阈值检测(maxVal,minVal):梯度值大于maxVal则处理为边界,小于minVal则舍弃,处于之间连有边界则保留,否则se舍弃

v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)

图像金字塔

up=cv2.pyrUp(img)
up_down=cv2.pyrDown(up)
l_1=img-down_up#拉普拉斯金字塔

6、图像轮廓

cv2.findContours(img,mode,method)

mode:轮廓检索模式
RETR_EXTERNAL :只检索最外面的轮廓;
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法
CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

返回值contours、hierarchy
contours是一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示
hierarchy是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 注意需要copy,要不原图会变。
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)#-1表示绘制所有轮廓

7、傅里叶变换

opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。
得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。
cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值