openCV学习笔记(三)--图像处理Image Processing
发布时间
阅读量:
阅读量
一:改变颜色空间(Change Colorspace)
1)打印改变颜色空间的所有方法:
import cv2
import numpy as np
from 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 cv2
import numpy as np
from 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:
break
cv2.destroyAllWindows()

这是一种基础的用于追踪物体的方法。学习到 contours 函数后,我们还可以进行更多操作,例如可以通过定位并计算物体中心位置来进行目标追踪,甚至只需轻轻移动你的手臂就能捕捉到目标的变化,并在这一基础上完成更多创意性的操作
2)找出HSV值并追踪
借助 OpenCV 库中的 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_INV
ret,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()

从官网截取的图片,可能太小了,所以不怎么看得清。
来一张狗狗的

感觉上就是说要去除其他元素,在图片上留下一个可见的像素点,在实践中逐步深入理解这些概念的意义。
Otsu's Binarization: 不确定这个单词是什么意思,并且'有道'翻译的效果让人觉得不可信
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,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 histograms
images = [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)
还没有任何评论哟~
