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-“膨胀”
 

![[VulnHub靶机渗透] FourandSix2.01](https://img-blog.csdnimg.cn/direct/3fbc8b77fc4b4b6fa06ba85f67ba7ff7.png)

















