Python学习日志(二)OpenCV图像处理部分一

色彩处理与几何变换

  • 提取色彩空间

两种最广泛使用的转换方法,BGR↔Gray和BGR↔HSV

对于BGR→Gray转换,我们使用标志cv.COLOR_BGR2GRAY。
类似地,对于BGR→HSV,我们使用标志cv.COLOR_BGR2HSV`
举例:提取视频画面中的蓝色对象(循环内的操作)

# 获取视频中的每一帧
_, frame = cap.read()

#从BGR转换为HSV颜色空间
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

# 定义蓝色区间
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])

# 将HSV图像阈值设为一系列蓝色
mask = cv.inRange(hsv, lower_blue, upper_blue)

# 按位操作提取
res = cv.bitwise_and(frame,frame, mask= mask)

cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
    break
cv.destroyAllWindows()

除此之外,倘若要对HSV的值进行跟踪,可以使用函数cv.cvtColor()。你只需传递所需的BGR值,而不是传递图像。例如,要查找绿色的HSV值,在Python终端中输入以下命令:

 green = np.uint8([[[0,255,0 ]]])
 hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
 print( hsv_green )
  • 图像变换
    OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,你可以使用它们进行各种转换。cv.warpAffine采用2x3变换矩阵作为参数输入,而cv.warpPerspective采用3x3变换矩阵作为参数输入。
    直接看代码
import numpy as np
import cv2 as cv

img = cv.imread('图片位置',0)
#一定注意cv.warpAffine()函数的第三个参数是输出图像的大小,它应该是(宽度,高度)的形式。请记住,width=列数,height=行数。
rows,cols = img.shape

#创建变换矩阵M,将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数。
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))

cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()
  • 图像阈值
    常用函数有:cv.threshold,cv.adaptiveThreshold等

cv.threshold函数第一个参数是源图像,它应该是灰度图像。第二个参数是用于对像素值进行分类的阈值。第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值。OpenCV提供不同类型的阈值,它由函数的第四个参数决定。类型有:(inv即inverse)
cv.THRESH_BINARY
cv.THRESH_BINARY_INV
cv.THRESH_TRUNC
cv.THRESH_TOZERO
cv.THRESH_TOZERO_INV

  • Otsu’s 二值化
    在全局阈值处理中,我们使用任意值作为阈值,那么,我们如何知道我们选择的值是好还是不好?答案是,试错法。但如果是双峰图像(简单来说,双峰图像是直方图有两个峰值的图像)我们可以将这些峰值中间的值近似作为阈值,这就是Otsu二值化的作用。简单来说,它会根据双峰图像的图像直方图自动计算阈值。(对于非双峰图像,二值化不准确。)

为此,使用了我们的cv.threshold()函数,但是需要多传递一个参数cv.THRESH_OTSU。这时要吧阈值设为零。然后算法找到最佳阈值并返回第二个输出retVal。如果未使用Otsu二值化,则retVal与你设定的阈值相同。
请查看以下示例。输入图像是嘈杂的图像。在第一种情况下,我将全局阈值应用为值127。在第二种情况下,我直接应用了Otsu的二值化。在第三种情况下,我使用5x5高斯卷积核过滤图像以消除噪声,然后应用Otsu阈值处理。来看看噪声过滤如何改善结果。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('图片',0)

# 全局阈值处理
ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)

# 二值化阈值
ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

# 高斯滤波后的二值化
blur = cv.GaussianBlur(img,(5,5),0)
ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

# 绘制直方图
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 xrange(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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生稚晖君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值