Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计)

查找表(Look Up Table)

颜色缩减方法:如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值。但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种)。用如此之多的颜色可能会对我们的算法性能造成严重影响。其实有时候,仅用这些颜色的一小部分,就足以达到同样效果。所以其做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。

利用查找表,我们可以提前计算出结果,保存起来,运用的时候依靠一一映射,节约大量时间。

用途:

  • 色彩匹配

  • 伪色彩化

    LUT的各种风格

    • COLORMAP_AUTUMN = 0

    • COLORMAP_BONE = 1

    • COLORMAP_COOL = 8

    • COLORMAP_HOT = 11

    • COLORMAP_HSV = 9

    • COLORMAP_JET = 2

    • COLORMAP_OCEAN = 5

    • COLORMAP_PARULA = 12

    • COLORMAP_PINK = 10

    • COLORMAP_RAINBOW = 4

    • COLORMAP_SPRING = 7

    • COLORMAP_SUMMER = 6

    • COLORMAP_WINTER = 3

    src=cv.imread("D:/lena.jpg")
    cv.namedWindow("input",cv.WINDOW_AUTOSIZE)
    gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
    cv.imshow("input",gray)
    cv.imwrite("D:/gray.jpg",gray)
    dst=cv.applyColorMap(gray,cv.COLORMAP_SPRING)#输入的为灰度图像
    cv.imshow("dst",dst)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

通道分离与合并

OpenCV中默认imread函数加载图像文件,加载进来的是三通道彩色图像,色彩空间是RGB色彩空间、通道顺序是BGR(蓝色、绿色、红色)、对于三通道的图像OpenCV中提供了两个API函数用以实现通道分离与合并。

  • split 通道分离
  • merge 通道合并

在计算各通道的直方图、均值和方差时会用到通道的分离与合并

import cv2 as cv

src=cv.imread("D:/lena.jpg")
cv.namedWindow("input",cv.WINDOW_AUTOSIZE)
cv.imshow("input",src)

#蓝色通道为零
mv=cv.split(src)
mv[0][:,:]=0
dst1=cv.merge(mv)
cv.imshow("output1",dst1)

#绿色通道为零
mv=cv.split(src)
mv[1][:,:]=0
dst2=cv.merge(mv)
cv.imshow("output2",dst2)

#红色通道为零
mv=cv.split(src)
mv[2][:,:]=0
dst3=cv.merge(mv)
cv.imshow("output3",dst3)

cv.mixChannels(src,dst3,[2,0])
cv.imshow("output4",dst3)

cv.waitKey(0)
cv.destroyAllWindows()

色彩空间的转换

  • RGB色彩空间 独立于设备的色彩空间 图像的处理

  • HSV色彩空间 对于直方图的处理,

  • YUV色彩空间 跟设备有关,手机相机rawdata文件

  • YCrCb色彩空间 做皮肤检测效果好

    相关API

    cvtColor() 色彩转换

    inRange() 提取指定色彩区域

Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计)_第1张图片

src2=cv.imread("D:/WindowsLogo.jpg")
cv.imshow("src2",src2)
hsv=cv.cvtColor(src2,cv.COLOR_BGR2HSV)
mask=cv.inRange(hsv,(35,43,46),(77,255,255))#根据上图查表知,提取的颜色为绿色
dst1=cv.bitwise_and(src2,src2,mask=mask)#白色为所选区的部分
dst2=cv.bitwise_not(src2,mask=mask)#绿色取反为偏紫色
cv.imshow("mask",mask)
cv.imshow("dst1",dst1)
cv.imshow("dst2",dst2)

结果如下

Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计)_第2张图片
Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计)_第3张图片
Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计)_第4张图片

像素值统计

  • 最小min

  • 最大max

  • 均值mean

  • 标准方差standard deviation

    相关API

    minMaxLoc()计算最大最小值

    meanStdDev()计算均值与标准方差

min,max,minLoc,maxLoc = cv.minMaxLoc(src)#最小、最大像素值以及它们的位置
means,stddev = cv.meanStdDev(src)#均值和标准方差
#转二值图像的一种方法
src[np.where(src<means)]=0
src[np.where(src>means)]=255
cv.imshow("binary",src)

你可能感兴趣的:(Opencv学习笔记二(查找表,通道分离与合并,色彩空间转换,像素值统计))