#一. 读入图像
#####1. cv2.imread():
#二. 显示图像
#####1. cv2.imshow():
#三. 保存图像
#####1. cv2.imwrite():
#四.用摄像头捕获视频
#####1. cv2.VideoCapture():
#五. 保存视频
#####1. cv2.VideoWriter_fourcc():
视频解码器
#####2. cv2.flip():实现视频翻转。
翻转相关的参数
#六. 用Opencv绘图
#####1. cv2.line():
#七,把鼠标当画笔
#####1. 可以用下列的代码查看所有被支持的鼠标事件
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
鼠标事件
#####2. cv2.setMouseCallback():
将窗口与鼠标事件绑定在一起。
第一个参数windowName:窗口名称;
第二个参数MouseCallback:鼠标响应回调函数;
第三个参数param:响应函数传递的参数
利用鼠标事件完成绘图的代码例子
import cv2
import numpy as np
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
# 新建图像窗口并将窗口与回调函数绑定
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)&0xFF==27:
break
cv2.destoryAllWindows()
#####3.Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。
#八,图像的基础操作
#####1. 获取并修改像素值
>- img.item()
>- img.itemset()
获取修改像素值的详解
#####2. 获取图像的属性
#####图像的属性包括:行,列,通道,图像数据类型,像素数目等
#####img.shape():
可以获取图像的形状,返回值是一个包含行数,列数,通道数的元组;
img.shape[:2]:取彩色图片的高宽;
img.shape[:3]:取彩色图片的高,宽,通道
#####img.size:
可以返回图像的像素数目
#####img.dtype:
可以返回图像的数据类型
#####3. 图像ROI:ROI指感兴趣区域
#####4. 将图片中某行某列拷贝到某行某列
eg:
img = cv2.imread('1.jpg')
ball = img[280:340,330:390]
img[273:333,100:160] = ball
#####5.拆分及合并图像通道
-cv2.split():通道分离函数,得到各个通道的灰度图
-cv2.merge():通道合并函数
python3+opencv 图像通道的分离(split()函数)和合并(merge()函数)
#####6. 为图像扩边(填充)
#####cv2.copyMakeBorder(): 用来给图片添加边框;
- cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要 下一个参数(value)
- cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
- cv2.BORDER _ REFLECT _ 101 or cv2.BORDER _ DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
- cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
- cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg
图像扩边的代码示例
第七个参数value :如果borderType设置为BORDER_CONSTANT(纯色边框),则这个参数为边框的颜色
#####7.图像加法
#####cv2.add():
将两幅图像进行加法运算,两幅图像的大小,类型必须一致,或者第二个图像可以是一个简单的标量值。
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y))
[[255]] #250+10=260=>255
print(x+y)
[4]#250+10=260%256=4
#####8.图像减法
#####cv2.subtract():
#####9.图像混合
#####计算公式:g(x)=(1-a)f0(x)+af1(x)
#####cv2.addWeighted():
#九,程序性能检测及优化
#####1. cv2.getTickCount():
#十,颜色空间转换
#####1. cv2.cvtColor():
- BGR<->Gray:
cv2.COLOR_BGR2GRAY- BGR<->HSV:cv2.COLOR_BGR2HSV
#####2.在OpenCV的HSV格式中,H(色彩/色度)的取值范围是[0,179],S(饱和度)的取值范围是[0,255],V(亮度)的取值范围[0,255]。
#####3. cv2.inRange():
设置阈值,去除背景部分;
第一个参数hsv:转换为HSV的图片,
第二个参数lower_red:指图像中低于这个lower_red的值,图像值变为0;
第三个参数upper_red:指图像中高于这个upper_red的值,图像值变为0;
#####4. 用inRange()函数制作完掩膜后,将原图像和掩膜进行位运算;
#####5. green = np.uint8([0,255,0])是错误的;应该是([[[0,255,0]]]);这里的三层括号分别对应cvArray,cvMat,IplImage
#####6. 寻找对应颜色的HSV值的代码:
green = np.uint8([[[0,255,0]]])
hsv_green =cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
#十一,几何变换
#####1. cv2.resize():
###5种插值方法:
- INTER_NEAREST:最近邻插值法
- INTER_LINEAR:双线性插值法(默认)
- INTER_AREA:基于局部像素的重采样。对于图像抽取来说,这可能是一个封号的方法;但如果是放大图像是,它和最近邻法的效果类似。
- INTER_CUBIC:基于 4x4像素邻域的3次插值法
- INTER_LANCZOS4:基于 8x8像素邻域的Lanczos插值
#####如果要缩小图像,通常推荐使用INTER _ AREA插值效果最好,而要放大图像,通常使用INTER _ CUBIC(速度较慢,但效果最好),或者使用INTER _ LINEAR(速度较快,效果还可以)。
#####2.cv2.warpAffine():
#十二,图像阈值
#####1. cv2.threshold():简单阈值,一般是灰度图
- cv2.ADAPTIVE _ THRESH_MEAN _ C
- cv2.ADAPTIVE_THRESH _ GAUSSIAN _ C
- cv2.THRESH _ B
INARY- cv2.THRESH _ BINARY_INV
- cv2.THRESH _ TRUNC
- cv2.THRESH _ TOZERO
- cv2.THRESH _ TOZERO _ INV
#十三,图像模糊:OpenCV的滤波与卷积
#####1. numpy.one():创建数组
第一个参数shape:定义返回元组的形状, 传入int或ints元组, 如果传入int,返一维数组,如果传入ints元组,返回多维数组。
np.ones(shape=(5,4)) # 返回一个5行4列的数组,元素的内容都为1
第二个参数dtype:定义的数据类型,可选参数。默认numpy.float64。例如:numpy.int8
ones = np.ones(shape=(3,2,3), dtype=int) # 返回3个两行三列都为1的数组
第三个参数order:可选, 返回多维数组时,内存的排列方式
numpy的使用
#####2. cv2.filter2D():对一幅图像进行卷积操作
#####3.LPF(低通滤波) 帮助我们去除噪音,模糊图像。HPF(高通滤波) 帮助我们找到图像的边缘
#####4.cv2.blur():均值滤波,典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
#####5.cv2.boxFilter():表示进行方框滤波
- 当参数 normalize = 1时,表示要进行归一化处理,要用邻域像素值的和除以面积
- 当参数 normalize =0时,表示不需要受进行一化处理,直接使用邻域像素值的和
- 当normalize = True则相当于均值滤波了,作用与cv2.blur()的作用一样
- normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示
#####6.cv2.GaussianBlur():一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程
#####7.cv2.medianBlur():一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点
#####8.cv2.bilateralFilter():双边滤波,能在保持边界清晰的情况下有效的去除噪音,但是这种操作与其他滤波器相比会比较慢;是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
#十四,形态学转换
#####1. cv2.erode():腐蚀,把前景物体的边界腐蚀掉(但是前景仍然是白色)。
#####2. getStructuringElement():制作操作内核。
#####3. cv2.dilate():膨胀,会增加图像中的白色区域(前景)。
#####4. 开运算:先腐蚀后膨胀,用来去除噪音,排除小团的物体;
#####5. 闭运算:先膨胀后腐蚀,被用来填充前景物体中的小洞,或者前景物体上的小黑点
#####6. 形态学梯度:图像膨胀与腐蚀之差,可以保留物体的边缘轮廓
#####7. 顶帽:原始图像和进行开运算之后的图像的差,突出原图像中比周围亮的区域
#####8. 黑帽:进行闭运算之后的图像与原始图像之差,突出原图像中比周围暗的区域
#####9. cv2.morphologyEx():函数是一种形态学变化函数。数学形态学可以理解为一种滤波行为,因此也称为形态学滤波。滤波中用到的滤波器(kernal),在形态学中称为结构元素。结构元素往往是由一个特殊的形状构成,如线条、矩形、圆等。
- MORPH_OPEN —— 开运算:对图像先腐蚀再膨胀,可以排除小团的物体
- MORPH_CLOSE —— 闭运算:对图像先膨胀再腐蚀,可以排除小型黑洞
- MORPH_GRADIENT —— 形态学梯度:图像膨胀与腐蚀之差,可以保留物体的边缘轮廓
- MORPH_TOPHAT —— “顶帽”:原始图像和进行开运算之后的图像的差,突出原图像中比周围亮的区域
- MORPH_BLACKHAT —— “黑帽”:进行闭运算之后的图像与原始图像之差,突出原图像中比周围暗的区域
#十五,图像梯度
#####1. cv2.Sobel():Sobel算子,是高斯平滑与微分操作的结合体,所以它的抗噪声能力很好。
#####2. cv2.Scharr():Scharr算子,如果 ksize=-1,会使用 3x3 的 Scharr 滤波器,它的的效果要比 3x3 的 Sobel 滤波器好(而且速度相同,所以在使用 3x3 滤波器时应该尽量使用 Scharr 滤波器);Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确
#####3. cv2.Laplacian(): 利用sobel算子的运算。它通过加上sobel算子运算出的图像x方向和y方向上的导数,来得到我们载入图像的拉普拉斯变换结果。
#####4. 当我们可以通过参数 -1 来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的却是 cv2.CV _ 64F。这是为什么呢?想象一下一个从黑到白的边界的导数是整数,而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.uint8 时,所有的负值都会被截断变成 0,换句话说就是把把边界丢失掉。所以如果这两种边界你都想检测到,最好的的办法就是将输出的数据类型设置的更高,比如 cv2.CV _ 16S,cv2.CV _ 64F 等。取绝对值然后再把它转回到 cv2.CV _ 8U。
#十六,Canny边缘检测:边缘检测和轮廓检测的区别
#####1. cv2.Canny():探测图像边缘
#十七,图像金字塔
#####1. pyrup和pyrdown函数只能固定对图像进行长宽二倍或半倍的缩小和放大,不能是其他大小
#####2. cv2.pyrDown():从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低),对图片做向下采样操作,通常也可以做模糊化处理
#####3. cv2.pyrUp():从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。
#####4. 拉普拉斯金字塔计算公式:Li=Gi-pyrUp(Gi+1), 其中i和i+1为下角标
import cv2
import numpy as np
img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',0)
img1=cv2.pyrDown(img)
img2=cv2.pyrUp(img1)
img3=img-img2#laplace金字塔
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
#####5.使用金字塔进行图像融合
#十八,OpenCV中的轮廓
#####1. 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测。
#####2. 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色
#####3.cv2.findContours():在二值图像中查找轮廓
- cv2.RETR_EXTERNAL:只检测外轮廓
- cv2.RETR_LIST:检测的轮廓不建立等级关系
- cv2.RETR_C
COMP:建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息- cv2.RETR_TREE:建立一个等级树结构的轮廓
- cv2.CHAIN_ APPROX_NONE:存储所有边界点
- cv2.CHAIN _APPROX _SIMPLE:压缩垂直、水平、对角方向,只保留端点
-cv2.CHAIN _ APPROX _ TX89 _ L1: 使用teh-Chini近似算法- cv2.CHAIN _ APPROX _ TC89 _ KCOS: 使用teh-Chini近似算法
#####5. cv2.moments():将计算得到的矩以一个字典的形式返回
第一个参数src:输入图像
第二个参数binaryimage:默认值是false,如果为true,则所有非零的像素都会按值1对待,也就是说相当于对图像进行了二值化处理,阈值为1
根据这些矩的值,可以计算出对象的重心:Cx = M10/M00,Cy = M01/M00
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
#####6. cv2.contourArea():返回轮廓的面积
#####7. cv2.arcLength():返回轮廓的周长即弧长
#####8. cv2.approxPolyDP():把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。
第一个参数cnt:由图像的轮廓点组成的点集
第二个参数approxCurve:输出折线
第三个参数epsilon:是从原始轮廓到近似轮廓的最大距离。它是一个准确度参数
第四个参数bool:表示输出的多边形是否闭合,以用来指定对象的形状是闭合的(True),还是打开的(一条曲
线)
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon)
#####9. cv2.convexHull():以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。
#####11. cv2.boundingRect():计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的,一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。所以边界矩形的面积不是最小的。
第一个参数cnt:由图像的轮廓点组成的点集
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
其中(x,y)为矩形左上角坐标,(w,h)是矩形的宽和高
#####12. cv2.minAreaRect():
#####13.cv2.boxPoints():
第一个参数rect:为cv2.minAreaRect()函数的返回值;
返回一个旋转矩阵的四个顶点
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
print (box)
box = np.int0(box)
cv2.drawContours(frame,[box], 0, (0, 0, 255), 2)
#####14.cv2.minEnclosingCircle():可以帮我们找到一个对象的外切圆。它是所有能够包括对象的圆中面积最小的一个
第一个参数cnt:由图像的轮廓点组成的点集
返回值center:最小外切圆的中心点
返回值radius:最小外切圆的半径
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)
#####15. cv2.fitEllipse():返回一个旋转边界矩形的内切椭圆
#####16. cv2.fitLine():
- cv2.DIST_USER : User defined distance
- cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
- cv2.DIST_L2: 欧式距离,此时与最小二乘法相同
- cv2.DIST_C:distance = max(|x1-x2|,|y1-y2|)
- cv2.DIST_L12:L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
- cv2.DIST_FAIR:distance = >- c^2(|x|/c-log(1+|x|/c)), c = 1.3998
- cv2.DIST_WELSCH: distance = c2/2(1-exp(-(x/c)2)), c = 2.9846
- cv2.DIST_HUBER:distance = |x|
#####1. 边界矩形的长宽比:
Aspect Ration = Width / Height
#####2. Extent:轮廓面积与边界矩形面积的比。
Extent = Object Area / Bounding Rectangle Area
#####3. Solidity:轮廓面积与凸包面积的比。
Solidity = Contour Area / Convex Hull Area
#####4. Equivalent Diameter:与轮廓面积相等的圆形的直径
Equivalent Diameter = sqrt(4 x Contour Area) / pi
#####5. 方向:对象的方向,下面的方法还会返回长轴与短轴的长度
(x,y),(MA,ma),angl = cv2.fitEllipse(cnt)
#####6. 掩膜和像素点:有时我们需要构成对象的所有像素点,我们可以这样做:
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)
这里我们是用来两种方法,第一e种方法使用了 Numpy 函数,第二种使用
了 OpenCV 函数。结果相同,但还是有点不同。Numpy 给出的坐标是(row,
colum)。形式的。而 OpenCV 给出的格式是(x,y)形式的。所以这两个结果基本是可以互换的。row=x,colunm=y。
#####7. 最大值和最小值及它们的位置cv2.minMaxLoc():设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引
第一个参数src:一个矩阵
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)
#####8.平均颜色及平均灰度cv2.mean():使用相同的掩模求一个对象的平均颜色或平均灰度
mean_val = cv2.mean(im,mask = mask)
#####9.极点:一个对象最上面,最下面,最左边,最右边的点。
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
#二十,轮廓:更多函数
#####1.cv2.convexityDefect():帮助我们找到凸缺陷
第一个参数cnt:由图像的轮廓点组成的点集
第二个参数hull:cv2.convexHull所找到的凸包
如果要查找凸缺陷,在使用函数 cv2.convexHull 找凸包时,参数
returnPoints 一定要是 False。
它会返回一个数组,其中每一行包含的值是 [起点,终点,最远的点,到最
远点的近似距离]。我们可以在一张图上显示它。我们将起点和终点用一条绿线
连接,在最远点画一个圆圈,要记住的是返回结果的前三个值是轮廓点的索引。
所以我们还要到轮廓点中去找它们。
hull = cv2.convexHull
(cnt,returnPoints = False)#这里一定要是False
defects = cv2.convexityDefects(cnt,hull)
#####2. cv2.pointPolygonTest():求解图像中的一个点到一个对象轮廓的最短距离。如果点在轮廓的外部,返回值为负。如果在轮廓上,返回值为 0。如果在轮廓内部,返回值为正。
#####3. cv2.matchShape():帮我们比较两个形状或轮廓的相似度,如果返回值越小,匹配越好;完全相同的图像返回值是0,返回值最大是1
- CV_CONTOUR_MATCH_I1
- CV_CONTOURS_MATCH_I2
- CV_CONTOURS_MATCH_I3
#####4.Hu 矩是归一化中心矩的线性组合,之所以这样做是为了能够获取代表图像的某个特征的矩函数,这些矩函数对某些变化如缩放,旋转,镜像映射(除了 h1)具有不变形
#二十一,轮廓的层次结构
#####1. 通常我们使用函数 cv2.findContours 在图片中查找一个对象。有时对象可能位于不同的位置。还有些情况,一个形状在另外一个形状的内部。这种情况下我们称外部的形状为父,内部的形状为子。按照这种方式分类,一幅图像中的所有轮廓之间就建立父子关系。这样我们就可以确定一个轮廓与其他轮廓是怎样连接的,比如它是不是某个轮廓的子轮廓,或者是父轮廓。这种关系就成为组织结构
#####2. OpenCV 使用一个含有四个元素的数组表示。[Next,Previous,First_Child,Parent]。
- Next 表示同一级组织结构中的下一个轮廓。
- Previous 表示同一级结构中的前一个轮廓。
- First_Child 表示它的第一个子轮廓。
- Parent 表示它的父轮廓。
#二十二,直方图的计算,绘制与分析
#####1. 什么是直方图?
#####2. BINS:将[0,255]的像素数进行分组,每个小组就被成为BIN
#####3. DIMS:表示我们收集数据的参数数目,一般来说,我们对收集到的数据值考虑一件事:灰度值,就是1
#####4. RANGE:要统计的灰度值范围,一般来说为[0,256]
#####5. cv2.calcHist():帮助我们统计一幅图像的直方图
#####6. plt.hist():绘制直方图
第一个参数x:数据
第二个参数bins:条形数
第三个参数color:颜色
第四个参数density:是否以密度的形式显示,bool类型
第五个参数range:x轴的范围
第六个参数bottom:y轴的起始位置
第七个参数histtype:线条的类型;“bar”:方形,“barstacked”:柱形,“step”:“未填充线条”,“stepfilled”:“填充线条”
第八个参数align:对齐的方式;“left”:左,“mid”:中间,“right”:右
第九个参数orientation: “horizontal”:水平,“vertical”:垂直
第十个参数log:单位是否以科学计数法;bool类型
img = cv2.imread('home.jpg',0)
plt.hist(img.ravel(),256,[0,256]);
plt.show()
img = cv2.imread('home.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
#####7. 要统计图像某个局部区域的直方图只需要构建一副掩模图像。将要统计的部分设置成白色,其余部分为黑色,就构成了一副掩模图像。然后把这个掩模图像传给函数就可以了。
img = cv2.imread('home.jpg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
#####8. 直方图均衡化的作用:直方图均衡化经常用来使所有的图片具有相同的亮度条件的参考工具。这在很多情况下都很有用。例如,脸部识别,在训练分类器前,训练集的所有图片都要先进行直方图均衡化从而使它们达到相同的亮度条件。
直方图均衡化要注意的各个点
#####9. cv2.equalizeHist():
第一个参数src:要均衡化的原图像的灰度图
返回一个均衡化后的图像
img = cv2.imread('5.jpg',0)
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ)) #两个图片的像素分布连接在一起,拍成一维数组
cv2.imshow('image',res)
cv2.waitKey(0)
#####10. ,由于太亮我们丢失了很多信息。造成这种结果的根本原因在于这幅图像的直方图并不是集中在某一个区域
#####11. cv2.createCLAHE():自适应的直方图均衡化
第一个参数clipLimit:颜色对比度的阈值
第二个参数 titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作(默认是(8,8))
img = cv2.imread('5.jpg',0)
clahe = cv2.createCLAHE(clipLimit=2,tileGridSize=(8,8))
cll = clahe.apply(img)#把clahe这种局部直方图均衡化应用到灰度图gray
#####12.np.histogram2d():绘制2D直方图
第一个参数h:H通道的数据样本
第二个参数s:S通道的数据样本
第三个参数bins:BIINS的数目
第四个参数range:两个数据样本的数值范围
img = cv2.imread('5.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
hist = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
#hist,xbins,ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
cv2.imshow('image',hist)
cv2.waitKey(0)
#####13. OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。它的参数与函数 cv2.calcHist 的参数基本相同。其中的一个参数是我们要查找目标的直方图。同样再使用目标的直方图做反向投影之前我们应该先对其做归一化处理。返回的结果是一个概率图像,我们再使用一个圆盘形卷积核对其做卷操作,最后使用阈值进行二值化。
#####14. 直方图反向投影的概述:反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征。反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目。
#####15.直方图反向投影的作用:它可以用来做图像分割,或者在图像中找寻我们感兴趣的部分。简单来说,它会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)。这是一个直观的解释。直方图投影经常与 camshift算法等一起使用。
#####16. cv2.calcBackProject():
#####17.cv2.normalize():归一化函数,把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
- NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
- NORM_INF:归一化数组的C-范数(绝对值的最大值)。
- NORM_L1:归一化数组的L1-范数(绝对值的和)。
- NORM_L2:归一化数组的(欧几里德)L2-范数。
直方图反向投影的示例
#二十三,图像变换:傅里叶变换相关步骤
#####1. cv2.dft():进行傅里叶变换
#####2. cv2.idft():进行傅里叶的逆变换
#####3. np.fft.fftshift():将图像中的的低频部分移动到图像的中心
#####4. np.fft.ifftshift():将图像的低频和高频部分移动到图像原来的位置
#####5. cv2.magnitude(x,y):将sqrt(x2+y2)计算矩阵维度的平方根
#####6. 傅里叶变换:将图像从空间域转换为频率域
#####7. 高频指变化剧烈的灰度分量,即图像边界的地方, 低频指变换缓慢的灰度分量
#####8. 构建出的傅里叶变化的图片,将低频移到中间位置, 通常呈现中间亮,周围暗,是因为对于低频而言,波动较大,比如红色那条线,因此呈现亮,对于高频而言,波动较小,比如蓝色那条线,因此呈现暗
#二十三,模板匹配:模板匹配的示例
#####1. 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。
#####2. cv2.matchTemplate():
- CV _ TM _ SQDIFF:平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
- CV _ TM _ CCORR:相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
- CV _ TM _ CCOEFF:相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
- CV _ TM _ SQDIFF _ NORMED:归一化平方差匹配法
- CV _ TM _ CCORR _ NORMED:归一化相关匹配法
- CV _ TM _ CCOEFF _ NORMED:归一化相关系数匹配法
#####3. cv2.minMaxLoc():函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。咋一看感觉很复杂,但使用这个cv2.minMaxLoc()函数就可全部解决。函数返回的四个值就是上述所要得到的。
#二十四,Hough变换
#####1. cv2.HoughLines():
#####2. cv2.HoughLinesP():
#####3. cv2.HoughCircles():
#二十五,分水岭图像分割:分水岭图像分割代码示例
#####1. 距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离个最常见的距离变换算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全腐蚀。这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心呗Ⅵ像素点的距离。根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换
#####2. cv2.distanceTransform():
#####3. cv2.connectedComponents():该函数用以计算二值图像的连通域标记图像
#####4. cv2.watershed():函数详解
#二十六,视频分析
#####1. cv2.meanShift():框的大小限定
#####2.cv2.CamShift():返回的结果是一个带旋转角度的矩形,框的大小随跟踪物体变化而变化
#####3.背景减除函数: 构造高斯混合模型,从而进行背景减除;
#####cv2.createBackgroundSubtractorMOG():
#####cv2.createBackgroundSubtractorMOG2():
#####cv2.createBackgroundSubtractorGMG():
#二十七,图像去噪(非局部去噪)
#####1. cv2.fastNIMeanDenoising():使用对象为灰度图
#####2.cv2.fastNlMeansDenoisingColored():使用对象为彩色图
#####3.cv2.fastNlMeansDenoisingMulti() 适用于短时间的图像序列(灰度图像)
#####4. cv2.fastNlMeansDenoisingColoredMulti() 适用于短时间的图像序列(彩色图像)
-使用的参数与第一点相同
#二十八,图像修补
#####1.cv2.inpaint():