opencv 提供了cvtColor()函数,用于在图像中不同的色彩空间进行转换,用于后续处理。
void cvtColor( InputArray src, OutputArray dst, int code );
1. 图像色彩模式
a. 位图模式
位图模式是图像中最基本的格式,图像只有黑色和白色像素,是色彩模式中占有空间最小的,同样也叫做黑白图,它包含的信息量最少,无法包含图像中的细节,相当于只有0或者1. 一副彩色图如果要转换成黑白模式,则一般不能直接转换,需要首先将图像转换成灰度模式,再用
b. 灰度模式 CV_RGB2GRAY
灰度模式即使用单一色调来表示图像,与位图模式不同,不像位图只有0和1,使用256级的灰度来表示图像,一个像素相当于占用8为一个字节,每个像素值使用0到255的亮度值代表,其中0为黑色,255为白色,相当于从黑->灰->白的过度,通常我们所说的黑白照片就是这种模式,与位图模式相比,能表现出一定的细节,占用空间也比位图模式较大.
c. RGB模式
RGB模式为我们经常见到的,被称为真色彩。RGB模式的图像有3个颜色通道,分布为红(Red),绿(Green)和蓝(Bule),每个都占用8位一个字节来表示颜色信息,这样每个颜色的取值范围为0~255,那么就三种颜色就可以有多种组合,
当三种基色的值相等是,表现出为灰色,三种颜色都为255即为白色,三种颜色都为0,即为黑色.
RGB模式的图像占用空间要比位图,灰度图都要大,但表现出的细节更加明显.
d. HSV COLOR_BGR2HSV
色度、饱和度、亮度
e. HSB模式
是根据日常生活中人眼的视觉对色彩的观察得而制定的一套色彩模式,最接近与人类对色彩的辨认的思考方式,所有的颜色都是用色彩三属性来描述.
H:(色相):是指从物体反射或透过物体传播的颜色
S:(饱和度):是指颜色的强度或纯度,表示色相中灰色成分所占的比例
B:(亮度):是指颜色对相对明暗程度,通常 100%定义为白色;0%为黑色
除了上述以上之外,还有索引模式,多通道模式等等不再介绍
2.图像分割
灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。
彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB等都可以用于分割。
彩色图分割函数 void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
例如根据HSV中红色的值进行分割处理
图像基本运算 :或,异或,非,与
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //或
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //异或
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray()); //非
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //与
3.
高级形态学变换:
膨胀:给图像中的对象边界添加像素,用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值,给图像中的对象边界添加像素,使二值图像扩大一圈。
1. 用结构元素,扫描图像的每一个像素
2. 用结构元素与其覆盖的二值图像做“与”操作
3. 如果都为0,结果图像的该像素为0。否则为1
也就是在结构元素覆盖范围下,只要有一个像素符和结构元素像素相同,那么中心点对应点就为1,否则为0
腐蚀:删除对象边界的某些像素,用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值,删除对象边界的某些像素,使二值图像减小一圈。
1. 用结构元素,扫描图像的每一个像素
2. 用结构元素与其覆盖的二值图像做“与”操作
3. 如果都为1,结果图像的该像素为1。否则为0
也就是查找被处理图像中能不能找到和结构元素相同的矩阵。如果存在那么中心点所对应的点就为1,否则为0
腐蚀用于分割(isolate)独立的图像元素,膨胀用于连接(join)相邻的元素
腐蚀、膨胀可用于去噪(低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点),图像轮廓提取、图像分割、寻找图像中的明显的极大值区域或极小值区域等
开运算:MORPH_OPEN – 开运算(Opening operation)
先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭运算:MORPH_CLOSE – 闭运算(Closing operation)
先膨胀,再腐蚀,可清除小黑点
形态学梯度:MORPH_GRADIENT - 形态学梯度(Morphological gradient)
膨胀图与腐蚀图之差,提取物体边缘
顶帽:MORPH_TOPHAT - 顶帽(Top hat)
原图像-开运算图,突出原图像中比周围亮的区域
黑帽:MORPH_BLACKHAT - 黑帽(Black hat)
闭运算图-原图像,突出原图像中比周围暗的区域
getStructuringElement函数—获取结构化元素,形态学处理,形态学操作,例如腐蚀,膨胀,开运算,闭运算等
形态学操作是根据图像形状进行的简单操作,一般情况下对二值化图像进行的操作。
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
矩形:MORPH_RECT; 交叉形:MORPH_CROSS; 椭圆形:MORPH_ELLIPSE;
morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
4. 二值图像取轮廓
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。
threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type ); //阈值分割,灰度图转至二值图
void findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,
int method, Point offset = Point()); //轮廓检测,只接受二值图
5.拟合和轮廓矩形的生成
void approxPolyDP( InputArray curve,
OutputArray approxCurve,
double epsilon, bool closed );
void rectangle(InputOutputArray img, Point pt1, Point pt2,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);