阈值处理是很多高级算法底层处理的预方法之一。
自己求图像平均阈值:
- # -*- coding=GBK -*-
- import cv2 as cv
- import numpy as np
- #求出图像均值作为阈值来二值化
- def custom_image(image):
- gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
- cv.imshow("原来", gray)
- h, w = gray.shape[:2]
- m = np.reshape(gray, [1, w*h])#化为一维数组
- mean = m.sum() / (w*h)
- print("mean: ", mean)
- ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
- cv.imshow("二值", binary)
- src = cv.imread("C://1.jpg")
- custom_image(src)
- cv.waitKey(0)
- cv.destroyAllWindows()
基于cv.inRange() 的彩色图像分割与视频图像追踪
灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB等都可以用于分割!
inRange()函数介绍
主要介绍inrange() 来划分颜色区域。
1、RGB颜色空间每个通道分量受亮度影响大,HSV颜色空间受亮度影响较小,所以在HSV颜色空间下进行颜色追踪;
2、EmguCV与OpenCV的HSV取值: H:0-180 ; S: 0-255; V: 0-255(注意取值范围);

3、常用的HSV参考值:

4、使用inRange()函数在HSV空间中寻找HSV在某一范围内的值,输出掩膜,作为寻找结果。
- # 源图像中仅有图像值介于 lowerb 和 upperb 之间的值才不为 0 ,且值将变成 255
- dst = cv2.inRange(src, lowerb, upperb)
- # src为输入图像
- # lowerb为lower阈值, 低于 lowerb 的值,其所对应的图像值将为 0,变黑;
- # upperb为upper阈值, 高于 upperb 的值,图像值变为 0
- # **dst** 返回处理后的图像

代码示例:
- import cv2
- import numpy as np
- img_cv2 = cv2.imread(img_file)
- hsv = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2HSV)
- lower_red = np.array([20, 20, 20])
- upper_red = np.array([200, 200, 200])
- # mask -> 1 channel
- mask = cv2.inRange(hsv, lower_red, upper_red)
- # cv2.imshow('Display', mask)
- # cv2.waitKey(0)
- # cv2.destroyAllWindows()
- plt.subplot(1,2,1); plt.imshow(img_cv2);plt.axis('off');plt.title('BGR')
- plt.subplot(1,2,2); plt.imshow(mask);plt.axis('off');plt.title('mask')
- plt.show()
2.视频特定颜色追踪
- #视频特定颜色追踪
- import cv2 as cv
- import numpy as np
- def extrace_object_demo():
- capture=cv.VideoCapture("C:/Users/df/Desktop/3333.mp4")
- while True:
- ret, frame = capture.read()
- if ret == False:
- break
- hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) #色彩空间由RGB转换为HSV
- lower_hsv = np.array([100, 43, 46]) #设置要过滤颜色的最小值
- upper_hsv = np.array([124, 255, 255]) #设置要过滤颜色的最大值
- mask = cv.inRange(hsv, lower_hsv, upper_hsv) #调节图像颜色信息(H)、饱和
- 度(S)、亮度(V)区间,选择蓝色区域
- cv.imshow("video",frame)
- cv.imshow("mask", mask)
- c = cv.waitKey(40)
- if c == 27: #按键Esc的ASCII码为27
- break
- extrace_object_demo()
- cv.destroyAllWindows()
3.追踪视频中的颜色对图片通道的分离与合并
- from cv2 import cv2 as cv
- import numpy as np
- def video_demo():
- # VideoCapture.open
- capture = cv.VideoCapture('C:\\pictures\\videos\\1.mp4')
- while True:
- ret,frame = capture.read()
- if ret == False:
- break
- hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
- # 根据那个表可以修改所想的颜色,可以追踪中视频中的颜色
- lower_hsv = np.array([156,43,46])
- upper_hsv = np.array([180,255,255])
- mask = cv.inRange(hsv,lowerb=lower_hsv, upperb=upper_hsv)
- # 小技巧,所显示的是所需要的颜色部分
- dst = cv.bitwise_and(frame,frame,mask=mask)
- cv.imshow('dst',dst)
- cv.imshow('video',frame)
- cv.imshow('mask',mask)
- c = cv.waitKey(40)
- if c == 27 :
- break
- '''
- filepath = "C:\\pictures\\0.jpg"
- img = cv.imread(filepath) # blue green red
- cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
- cv.imshow("input image",img)
- # 通道的分离与合并
- b,g,r = cv.split(img)
- cv.imshow('blue',b)
- cv.imshow('green',g)
- cv.imshow('red',r)
- img[:,:,2] = 0 #把红色去掉了
- img = cv.merge([b,g,r]) #通道合起来
- cv.imshow('changed image',img)
- '''
- video_demo()
- cv.waitKey(0)
- cv.destroyAllWindows()
图像缩放:
图像缩放只是调整图像的大小,为此, OpenCV 为我们提供了一个函数 cv.resize() ,原函数如下:
resize(src, dsize, fx=None, fy=None, interpolation=None)
- import cv2 as cv
- #读取图片
- src = cv.imread('maliao.jpg')
- print(src.shape)
- #图像缩放
- result = cv.resize(src, (300, 150))
- print(result.shape)
- #显示图像
- cv.imshow("src", src)
- cv.imshow("result", result)
- #等待显示
- cv.waitKey()
- cv.destroyAllWindows()
结果如下:

需要注意的是,这里的 设置的是 dsize 的列数为 300 ,行数为 150 。
同理,我们可以通过设定一个比例进行缩放,可以是等比例缩放,也可以是不等比例缩放,下面是等比例缩放的示例:
- import cv2 as cv
- # 设定比例
- scale = 0.5
- #读取图片
- src = cv.imread('maliao.jpg')
- rows, cols = src.shape[:2]
- #图像缩放
- result = cv.resize(src, ((int(cols * scale), int(rows * scale))))
- print(result.shape)
- #显示图像
- cv.imshow("src", src)
- cv.imshow("result", result)
- #等待显示
- cv.waitKey()
- cv.destroyAllWindows()
除了可通过设定 dszie 对图像进行缩放,我们还可以通过设定 fx 和 fy 对图像进行缩放:
- import cv2 as cv
- #读取图片
- src = cv.imread('maliao.jpg')
- print(src.shape)
- #图像缩放
- result = cv.resize(src, None, fx=1.5, fy=0.2)
- print(result.shape)
- #显示图像
- cv.imshow("src", src)
- cv.imshow("result", result)
- #等待显示
- cv.waitKey()
- cv.destroyAllWindows()
两种操作方法:
- import cv2 as cv
- #读取图片
- src = cv.imread('maliao.jpg')
- print(src.shape)
- #图像缩放
- result1 = cv.resize(src, None, fx=0.5, fy=0.7)
- result2 = cv.resize(src, (src.shape[0]+200,src.shape[1]+300))
- print(result1.shape)
- print(result1.shape)
- #显示图像
- cv.imshow("src", src)
- cv.imshow("result1", result1)
- cv.imshow("result2", result2)
- #等待显示
- cv.waitKey()
- cv.destroyAllWindows()
- import cv2 as cv
- #读取图片
- src1 = cv.imread('1111.jpg')
- src2 = cv.imread('2222.jpg')
- #将图像1缩放为图像2的大小
- src1 = cv.resize(src1,(src2.shape[1],src2.shape[0]))
- #显示图像
- cv.imshow("result1", src1)
- cv.imshow("result2", src2)
- #等待显示
- cv.waitKey()
- cv.destroyAllWindows()
- import cv2 as cv
- import time
- #读取图片
- src = cv.imread('beauty5.jpeg')
- # 原图的高、宽
- rows, cols = src.shape[:2]
- i = 1
- while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
- if i<=12:
- i = i+1
- elif i>12:
- i = 1
- #图像缩放
- dst = cv.resize(src, None, fx=0.1*i, fy=0.1*i)
- # 生成 M 矩阵
- #M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i, 1)
- # 绕图像的中心旋转
- # 参数:旋转中心 旋转度数 scale
- #dst = cv.warpAffine(src, M, (cols, rows))
- # 显示图像
- cv.imshow("dst", dst)
- time.sleep(1/10)
- cv.destroyWindow("dst")