• 2.3 OpenCV随手简记(四)


    阈值处理是很多高级算法底层处理的预方法之一。

    自己求图像平均阈值:

    1. # -*- coding=GBK -*-
    2. import cv2 as cv
    3. import numpy as np
    4. #求出图像均值作为阈值来二值化
    5. def custom_image(image):
    6. gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    7. cv.imshow("原来", gray)
    8. h, w = gray.shape[:2]
    9. m = np.reshape(gray, [1, w*h])#化为一维数组
    10. mean = m.sum() / (w*h)
    11. print("mean: ", mean)
    12. ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
    13. cv.imshow("二值", binary)
    14. src = cv.imread("C://1.jpg")
    15. custom_image(src)
    16. cv.waitKey(0)
    17. cv.destroyAllWindows()

    基于cv.inRange() 的彩色图像分割与视频图像追踪

    灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB都可以用于分割!

    inRange()函数介绍

    主要介绍inrange() 来划分颜色区域。

    1RGB颜色空间每个通道分量受亮度影响大,HSV颜色空间受亮度影响较小,所以在HSV颜色空间下进行颜色追踪;

    2EmguCVOpenCVHSV取值: H0-180 ; S: 0-255; V: 0-255(注意取值范围;

     3、常用的HSV参考值:

     4、使用inRange()函数在HSV空间中寻找HSV在某一范围内的值,输出掩膜,作为寻找结果。

    1. # 源图像中仅有图像值介于 lowerb 和 upperb 之间的值才不为 0 ,且值将变成 255
    2. dst = cv2.inRange(src, lowerb, upperb)
    3. # src为输入图像
    4. # lowerb为lower阈值, 低于 lowerb 的值,其所对应的图像值将为 0,变黑;
    5. # upperb为upper阈值, 高于 upperb 的值,图像值变为 0
    6. # **dst** 返回处理后的图像

     代码示例:

    1. 颜色显示
    1. import cv2
    2. import numpy as np
    3. img_cv2 = cv2.imread(img_file)
    4. hsv = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2HSV)
    5. lower_red = np.array([20, 20, 20])
    6. upper_red = np.array([200, 200, 200])
    7. # mask -> 1 channel
    8. mask = cv2.inRange(hsv, lower_red, upper_red)
    9. # cv2.imshow('Display', mask)
    10. # cv2.waitKey(0)
    11. # cv2.destroyAllWindows()
    12. plt.subplot(1,2,1); plt.imshow(img_cv2);plt.axis('off');plt.title('BGR')
    13. plt.subplot(1,2,2); plt.imshow(mask);plt.axis('off');plt.title('mask')
    14. plt.show()

             2.视频特定颜色追踪

    1. #视频特定颜色追踪
    2. import cv2 as cv
    3. import numpy as np
    4. def extrace_object_demo():
    5. capture=cv.VideoCapture("C:/Users/df/Desktop/3333.mp4")
    6. while True:
    7. ret, frame = capture.read()
    8. if ret == False:
    9. break
    10. hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) #色彩空间由RGB转换为HSV
    11. lower_hsv = np.array([100, 43, 46]) #设置要过滤颜色的最小值
    12. upper_hsv = np.array([124, 255, 255]) #设置要过滤颜色的最大值
    13. mask = cv.inRange(hsv, lower_hsv, upper_hsv) #调节图像颜色信息(H)、饱和
    14. 度(S)、亮度(V)区间,选择蓝色区域
    15. cv.imshow("video",frame)
    16. cv.imshow("mask", mask)
    17. c = cv.waitKey(40)
    18. if c == 27: #按键Esc的ASCII码为27
    19. break
    20. extrace_object_demo()
    21. cv.destroyAllWindows()

            3.追踪视频中的颜色对图片通道的分离与合并

    1. from cv2 import cv2 as cv
    2. import numpy as np
    3. def video_demo():
    4. # VideoCapture.open
    5. capture = cv.VideoCapture('C:\\pictures\\videos\\1.mp4')
    6. while True:
    7. ret,frame = capture.read()
    8. if ret == False:
    9. break
    10. hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
    11. # 根据那个表可以修改所想的颜色,可以追踪中视频中的颜色
    12. lower_hsv = np.array([156,43,46])
    13. upper_hsv = np.array([180,255,255])
    14. mask = cv.inRange(hsv,lowerb=lower_hsv, upperb=upper_hsv)
    15. # 小技巧,所显示的是所需要的颜色部分
    16. dst = cv.bitwise_and(frame,frame,mask=mask)
    17. cv.imshow('dst',dst)
    18. cv.imshow('video',frame)
    19. cv.imshow('mask',mask)
    20. c = cv.waitKey(40)
    21. if c == 27 :
    22. break
    23. '''
    24. filepath = "C:\\pictures\\0.jpg"
    25. img = cv.imread(filepath) # blue green red
    26. cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
    27. cv.imshow("input image",img)
    28. # 通道的分离与合并
    29. b,g,r = cv.split(img)
    30. cv.imshow('blue',b)
    31. cv.imshow('green',g)
    32. cv.imshow('red',r)
    33. img[:,:,2] = 0 #把红色去掉了
    34. img = cv.merge([b,g,r]) #通道合起来
    35. cv.imshow('changed image',img)
    36. '''
    37. video_demo()
    38. cv.waitKey(0)
    39. cv.destroyAllWindows()


     图像缩放:

    图像缩放只是调整图像的大小,为此, OpenCV 为我们提供了一个函数 cv.resize() ,原函数如下:

    resize(src, dsize, fx=None, fy=None, interpolation=None)
    src 表示的是输入图像,而 dsize 代表的是输出图像的大小,如果为 0 ,则:
    dsize = Size(round(fx src.cols), round(fy src.rows))dsize = Size(round(fx src.cols), round(fy src.rows))
    dsize fx fy 不能同时为 0
    fx fy 是沿 x 轴和 y 轴的缩放系数,默认取 0 时,算法如下:
    fx=(double)dsize.width/src.colsfx=(double)dsize.width/src.cols
    fy=(double)dsize.height/src.rowsfy=(double)dsize.height/src.rows
    最后一个参数 interpolation 表示插值方式:
    • INTER_NEAREST - 最近邻插值
    • INTER_LINEAR - 线性插值(默认)
    • INTER_AREA - 区域插值
    • INTER_CUBIC - 三次样条插值
    • INTER_LANCZOS4 - Lanczos插值
    看一个简单的示例:
    1. import cv2 as cv
    2. #读取图片
    3. src = cv.imread('maliao.jpg')
    4. print(src.shape)
    5. #图像缩放
    6. result = cv.resize(src, (300, 150))
    7. print(result.shape)
    8. #显示图像
    9. cv.imshow("src", src)
    10. cv.imshow("result", result)
    11. #等待显示
    12. cv.waitKey()
    13. cv.destroyAllWindows()

    结果如下:

    需要注意的是,这里 设置的是 dsize 的列数为 300 ,行数为 150 

    同理,我们可以通过设定一个比例进行缩放,可以是等比例缩放,也可以是不等比例缩放,下面是等比例缩放的示例:

    1. import cv2 as cv
    2. # 设定比例
    3. scale = 0.5
    4. #读取图片
    5. src = cv.imread('maliao.jpg')
    6. rows, cols = src.shape[:2]
    7. #图像缩放
    8. result = cv.resize(src, ((int(cols * scale), int(rows * scale))))
    9. print(result.shape)
    10. #显示图像
    11. cv.imshow("src", src)
    12. cv.imshow("result", result)
    13. #等待显示
    14. cv.waitKey()
    15. cv.destroyAllWindows()

    除了可通过设定 dszie 对图像进行缩放,我们还可以通过设定 fx fy 对图像进行缩放:

    1. import cv2 as cv
    2. #读取图片
    3. src = cv.imread('maliao.jpg')
    4. print(src.shape)
    5. #图像缩放
    6. result = cv.resize(src, None, fx=1.5, fy=0.2)
    7. print(result.shape)
    8. #显示图像
    9. cv.imshow("src", src)
    10. cv.imshow("result", result)
    11. #等待显示
    12. cv.waitKey()
    13. cv.destroyAllWindows()

    两种操作方法:

    1. import cv2 as cv
    2. #读取图片
    3. src = cv.imread('maliao.jpg')
    4. print(src.shape)
    5. #图像缩放
    6. result1 = cv.resize(src, None, fx=0.5, fy=0.7)
    7. result2 = cv.resize(src, (src.shape[0]+200,src.shape[1]+300))
    8. print(result1.shape)
    9. print(result1.shape)
    10. #显示图像
    11. cv.imshow("src", src)
    12. cv.imshow("result1", result1)
    13. cv.imshow("result2", result2)
    14. #等待显示
    15. cv.waitKey()
    16. cv.destroyAllWindows()
    1. import cv2 as cv
    2. #读取图片
    3. src1 = cv.imread('1111.jpg')
    4. src2 = cv.imread('2222.jpg')
    5. #将图像1缩放为图像2的大小
    6. src1 = cv.resize(src1,(src2.shape[1],src2.shape[0]))
    7. #显示图像
    8. cv.imshow("result1", src1)
    9. cv.imshow("result2", src2)
    10. #等待显示
    11. cv.waitKey()
    12. cv.destroyAllWindows()
    缩放的动态显示
    1. import cv2 as cv
    2. import time
    3. #读取图片
    4. src = cv.imread('beauty5.jpeg')
    5. # 原图的高、宽
    6. rows, cols = src.shape[:2]
    7. i = 1
    8. while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
    9. if i<=12:
    10. i = i+1
    11. elif i>12:
    12. i = 1
    13. #图像缩放
    14. dst = cv.resize(src, None, fx=0.1*i, fy=0.1*i)
    15. # 生成 M 矩阵
    16. #M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i, 1)
    17. # 绕图像的中心旋转
    18. # 参数:旋转中心 旋转度数 scale
    19. #dst = cv.warpAffine(src, M, (cols, rows))
    20. # 显示图像
    21. cv.imshow("dst", dst)
    22. time.sleep(1/10)
    23. cv.destroyWindow("dst")

  • 相关阅读:
    学习阿里如何进行数据指标体系的治理
    response响应,常用方法,分发器重定向,错误提示
    使用 k3d 在Windows上安装 k3s
    使用html2canvas 进行屏幕截图(附带解决截百度地图时空白问题)
    进程,线程,并发相关入门
    全志V3S嵌入式驱动开发(开发环境再升级)
    周计划&周记录:2022年8月1日-2022年8月7日
    强化学习 | Python强化学习
    判定二分图(染色法)
    企业级存储详解与存储资源盘活
  • 原文地址:https://blog.csdn.net/SSS465/article/details/139417915