Opencv实战(2)绘图与图像操作
指路前文:Opencv实战(1)读取与像素操作
三、基本绘图
文章目录
- Opencv实战(2)绘图与图像操作
- 三、基本绘图
- (1).line
- (2).rectangle
- (3).circle
- 四、图像处理
- (1).颜色空间
- 1.意义
- 2.cvtColor()
- 3.inRange()
- 4.适应光线
- (2).形态操作
- 1.腐蚀
- 2.膨胀
- 3.开/闭运算
(1).line
void cv::line(InputOutputArray img,Point pt1, Point pt2, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0)
img | Image. |
---|---|
pt1 | First point of the line segment. |
pt2 | Second point of the line segment. |
color | Line color. |
thickness | Line thickness. |
lineType | Type of the line. See LineTypes. |
shift | Number of fractional bits in the point coordinates. |
(2).rectangle
void cv::rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar & color, int thickness = 1,int lineType = LINE_8, int shift = 0)
void cv::rectangle(InputOutputArray img, Rect rec, const Scalar & color, int thickness = 1,int lineType = LINE_8, int shift = 0)
(3).circle
void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0)
四、图像处理
(1).颜色空间
1.意义
-
RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
-
自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
-
在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
H(色调/hue) |
S(饱和度/saturation) |
V(明度/Value) |
2.cvtColor()
void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
- src:输入图像,可以是Mat类型的图像或者其他支持的图像数据结构。
- dst:输出图像,用于存储转换后的图像。
- code:颜色空间转换的代码,例如CV_BGR2GRAY表示将BGR颜色空间转换为灰度图像。
- dstCn:输出图像的通道数,如果为0,则自动根据code参数确定通道数。
3.inRange()
void inRange(InputArray src, InputArray lowerb,InputArray upperb, OutputArray dst);
void inRange(image, Scalar(hmin,smin,vmin), Scalar(hmax,smax,vmax), image);
//typedef Vec<double, 4> Scalar;
4.适应光线
光线较暗 -> 暗色调 ; 增加饱和度S ;减小亮度V
光线较亮 -> 亮色调 ; 减小饱和度S ;增大亮度V
(2).形态操作
1.腐蚀
腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界(总是尽量保持前景为白色)。那它有什么作用呢?内核在图像中滑动(如二维卷积)。只有当内核下的所有像素都为 1 时,原始图像中的像素(1 或 0)才会被视为 1,否则会被侵蚀(变为零)。
C++: void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT,
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
Point( g_nStructElementSize, g_nStructElementSize ));
2.膨胀
它与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。
C++: void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
3.开/闭运算
-
开运算(Opening Operation),其实就是先腐蚀后膨胀的过程。开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
-
先膨胀后腐蚀的过程称为闭运算(Closing Operation),闭运算能够排除小型黑洞(黑色区域)。
C++: void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue()
);
第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
- MORPH_OPEN – 开运算(Opening operation)
- MORPH_CLOSE – 闭运算(Closing operation)
- MORPH_GRADIENT -形态学梯度(Morphological gradient)
- MORPH_TOPHAT - “顶帽”(“Top hat”)
- MORPH_BLACKHAT - “黑帽”(“Black hat“)
- MORPH_ERODE-“腐蚀”
- MORPH_DILATE-“膨胀”