最近因为网络赛没有空认真写东西,然后我想了一下应该把每个函数知识点和对应的函数讲的细一点,It’s important。所以就自己划分了知识点,闲话少说,先来看今天的内容:
先来谈谈什么是颜色空间,颜色空间和数学中的“空间”在定义上有相似之处,我们吧颜色空间看成是三维(多维空间),这样一来所有的颜色就都能在颜色空间找到唯一对应的点。
就好比在三维空间里有直角坐标系,球坐标系,柱坐标系一样,颜色空间也有很多种,下面我们来简单谈谈几种常用的颜色空间:RGB,YUV,HSV
1.RGB:我们平时接触到最多的颜色空间,它使用了三原色的概念,R = Red ,G = Green ,B= Blue。任何一个颜色由这三个通道的值混合形成
2.HSV:HSV(Hue, Saturation, Value)是一种根据颜色的直观特性来确定的颜色空间,各维度代表,色调,饱和度,明度。这个颜色空间偶尔会用在分割图像上。
3.YUV:用于电视信号传输的一种颜色空间,仅供了解。
在Opencv中,提供了cv2.cvtColor(src,dst,code)
函数来进行颜色转换:
src:源图像
dst:目标图像
code:颜色空间转换代码,对应着选就可以,好比要把RGB(在python是BGR)变成HSV,选择COLOR_BGR2HSV
import cv2
import numpy as np
a = cv2.imread("imagepath")
b = cv2.cvtColor(a,cv2.COLOR_BGR2HSV)
cv2.imshow("123",b[:,:,2])
然后你就能看到图像的明度信息了
当然除了这一个转换代码,还有很多,你可以用这样的方式来查看所有的代码:
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
我们主要在需要灰度图像的时候使用这个函数来变换颜色空间到灰度空间。
二值化也叫阈值化,在我们不需要图像的颜色特征的时候,我们可以将图像变成仅仅由0,1组成的矩阵,这个方法在提取图像特征的时候是一个灰常好的办法。
OpenCv提供了两个函数来实现二值化cv2.threshold
cv2.adaptiveThreshold
要注意,两个函数的输入都必须是灰度图像。
下面先来看一个实例:
import cv2
import numpy as np
a = cv2.imread("lena.jpg",0)
ret,thresh = cv2.threshold(a,100,255,cv2.THRESH_BINARY)
cv2.imshow("out",thresh)
cv2.waitKey(0)
cv2.threshold
这个函数的第一个参数是输入图像,第二个参数是阈值,下一个是最大值,最后一个是二值化的方法。当二值化的方法不同时,具体的操作是不一样的。比如笔者用的cv2.THRESH_BINARY,就将所有大于阈值的像素灰度值设为最大值,其余的像素就变成0。除此之外可以选择像otsu法这样自动计算阈值的方法。当然你可能注意到这个函数有两个函数值,第一个函数值在不使用otsu的前提下返回的就是你设定的阈值,而后使用otsu就会返回算法计算出的阈值。
下面我们来看cv2.adaptiveThreshold
import cv2
import numpy as np
a = cv2.imread("lena.jpg",0)
thresh = cv2.adaptiveThreshold(a,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,2)
cv2.imshow("out",thresh)
cv2.waitKey(0)
这个算法的参数很多,第一个参数是输入图像,第二个参数还是最大值,第三个参数是自动化阈值的方法函数,第4个是用来具体进二值化操作的方法,第五个是窗口大小,第六个参数是一个常数。
这里没有了阈值要怎样计算呢?很简单,我们通过自动阈值函数来先计算出阈值,之后应用二值化操作的方法完成二值化。这个方法和上面cv2.threshold函数用到的方法效果是一样的
我们来根据自动阈值方法函数来讲一下,如果函数是ADAPTIVE_THRESH_MEAN_C,那么这个时候我们的阈值就为以窗口大小的灰度平均值减去常数,如果是ADAPTIVE_THRESH_GAUSSIAN_ 那么这个阈值就变成了窗口大小内像素灰度值的加权和,权值是一个窗口高斯分布。计算出权值后在应用二值化方法进行操作。
这样我们的第一部分就全部完成了,学习图像处理不可囫囵吞枣啊