openCV学习笔记(三)--图像处理Image Processing

来源:互联网 发布:cisco mac acl 编辑:程序博客网 时间:2024/05/14 04:45

一:改变颜色空间(Change Colorspace)

1)打印改变颜色空间的所有方法:
import cv2import numpy as npfrom matplotlib import pyplot as plt# openCV中有150改变多个颜色空间的方法,以下方法列出cv2中的所有方法,但是加了限制,所以只会打印改变颜色空间的方法flags=[i for i in dir(cv2) if i.startswith('COLOR_')]for i in flags:    print(i)# 虽然改变颜色空间的方法很多,但是我们只会学习应用最广泛的两个:BGR <--> Gray and BGR <--> HSV.# BGR <--> Gray:cv2.COLOR_BGR2GRAY# BGR <--> HSV:cv2.COLOR_BGR2HSV
因为150多个太多了,打印结果就不放上来了。
2)追踪图像中某一指定颜色的物体
import cv2import numpy as npfrom matplotlib import pyplot as plt# 官网上的例子是通过追踪摄像头里面的一个蓝色小球,但是我的摄像头有问题,所以我就改成追踪video里面的东西。cap = cv2.VideoCapture('test.mp4')while(1):    # 一帧一帧的读取图像中的内容    _,frame=cap.read()    # 把BGR转换成HSV    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)    # 在HSV中定义蓝色的范围    lower_blue=np.array([110,50,50])    upper_blue=np.array([130,255,255])    # 获取hsv图像的阈值来获取唯一的蓝色    mask=cv2.inRange(hsv,lower_blue,upper_blue)    # 使用Bitwise-AND计算mask和原始图片    res=cv2.bitwise_and(frame,frame,mask=mask)    # 显示信息的基本步骤    cv2.imshow('frame',frame)    cv2.imshow('mask',mask)    cv2.imshow('res',res)    k=cv2.waitKey(5) & 0xFF    if k==27:        breakcv2.destroyAllWindows()

这是用于追踪物体的最简单的方法。后面学到contours函数,我们还可以做很多事情,比如通过找到物体的重心并用这个重心去追踪物体,仅仅通过在镜头前移动你的手就可以画出图像以及其他许多有趣的事物。
2)找出HSV值并追踪
通过cv2.cvtColor()函数,可以不用传递一张图片,而仅仅给出一个BGR值就获取到HSV值。
green=np.uint8([[[0,255,0]]])hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)print(hsv_green)
[[[ 60 255 255]]]
二:图像阈值
1)Simple Thresholding
# 如果像素值比阈值大,它会被指定为一个值(或许是白色),如果像素值比阈值小,又会被指定为另一个值(或许是黑色)img = cv2.imread('threshold.png',0)# cv2.threshold:总共有四个参数# 第一个参数是源图片的位置,一般是一个灰色图片# 第二个参数是用来对像素值进行分类的阈值# 第三个参数是最大值,它表示像素值大于或小于阈值的值# 第四个参数:opencv提供了不同类型的阈值,由第四个参数决定,具体类型如下(各个类型的具体含义不是特别懂)#             cv2.THRESH_BINARY#             cv2.THRESH_BINARY_INV#             cv2.THRESH_TRUNC#             cv2.THRESH_TOZERO#             cv2.THRESH_TOZERO_INVret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]for i in range(6):    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')    plt.title(titles[i])    plt.xticks([]),plt.yticks([])plt.show()


2)Adaptive Thresholding
# 上一个例子中,我们使用的是一个全局的值作为一个阈值。但是,这样或许就不适用于所有的情况,比如图片的在不同的区域有不同的光照条件。# 因此,我们使用自适应的阈值。通过数学计算为图片的一小片区域计算阈值。# 我们可以获取一张图片不同位置的不同阈值,并且它会给我们一个对于图片不同的照明的更好的结果。img=cv2.imread('number.png',0)img = cv2.medianBlur(img,5)# 指定阈值ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)# 自适应阈值th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\            cv2.THRESH_BINARY,11,2)# cv2.ADAPTIVE_THRESH_MEAN_C : threshold value is the mean of neighbourhood area.#                               阈值是邻域面积的平均值th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\            cv2.THRESH_BINARY,11,2)#  cv2.ADAPTIVE_THRESH_GAUSSIAN_C :threshold value is the weighted sum of neighbourhood values where weights are a gaussian window.#                                  阈值是权重值为高斯窗口的邻域值的加权总和。titles = ['Original Image', 'Global Thresholding (v = 127)',            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']images = [img, th1, th2, th3]for i in range(4):    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')    plt.title(titles[i])    plt.xticks([]),plt.yticks([])plt.show()

从官网截取的图片,可能太小了,所以不怎么看得清。
来一张狗狗的
感觉就是把其余东西去掉,就留一个看得见的像素点在图片上,在后面的实践中再慢慢去理解这些的意义。

3)Otsu’s Binarization:不知道第一个单词是啥意思,有道翻译的,感觉不靠谱
# global thresholdingret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)# Otsu's thresholdingret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)# Otsu's thresholding after Gaussian filtering:高斯滤波后的otsu阈值blur = cv2.GaussianBlur(img,(5,5),0)ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)# plot all the images and their histogramsimages = [img, 0, th1,          img, 0, th2,          blur, 0, th3]titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',          'Original Noisy Image','Histogram',"Otsu's Thresholding",          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]for i in range(3):    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])plt.show()


matplotlib不是很了解,涉及相关的代码看不大懂,很多都是照着官方教程敲的代码,理解不了,只能说有个大概的了解了,硬啃,有难度,只有在后面的学习中慢慢来理解。

阅读全文
0 0