2021-03-18

opencv快速入门二
1.绘制形状和文字&&画图的基本知识
使用cv::Point与cv::Scalar;绘制线、矩形、园、椭圆等基本几何形状;随机生成和绘制文本
1.1cv::Point与cv::Scalar
Point表示2D平面上一个点x,y
Point p;p.x = 10;p.y = 8;
Point p = Point(10,8);//两种对点的描述方式倾向于第二种
Scalar表示四个元素的向量//表示了具有4个元素的数组。次类型在OpenCV中被大量用于传递像素值。
Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三个通道
1.2绘制形状
线、矩形、圆、椭圆
(1)画线 cv::line
void line(Mat& img, Point pt1,Point pt2, const Scalar& color, int thickness=1, int lineType=8,int shift=0)
img – 图像.
pt1 – 线条起点.
pt2 – 线条终点.
color – 线条颜色.
thickness – 线条宽度.
lineType – 线型
Type of the line:8 (or omitted) - 8-connected line;4 - 4-connected line.CV_AA - antialiased line.
shift – 坐标点小数点位数.
(2)画椭圆cv::ellipse
void ellipse(Mat& img, Point center,Size axes, double angle, double startAngle, double endAngle, const Scalar& color,int thickness=1, int lineType=8, int shift=0)
img – 椭圆所在图像.
center – 椭圆中心.
axes – 椭圆主轴一半的长度
angle – 椭圆旋转角度
startAngle – 椭圆弧起始角度
endAngle –椭圆弧终止角度
box – 指定椭圆中心和旋转角度的信息,通过 RotatedRect 或 CvBox2D. 这表示椭圆画在旋转矩形上(矩形是不可见的,只是指定了一个框而已)
color – 椭圆边框颜色.
thickness – 正值代表椭圆边框宽度,负值代表填充的椭圆
lineType – 线型
shift – 椭圆中心坐标和坐标轴的小数点位数
(3)画矩形cv::rectangle 画矩形Rect(x,y,width,height)
void rectangle(Mat& img,Point pt1, Pointpt2, const Scalar&color, intthickness=1,intlineType=8, intshift=0)
void rectangle(Mat& img,Rect rec, const Scalar&color, intthickness=1, intlineType=8,intshift=0 )
img – 画矩形的对象
pt1 – 矩形的一个顶点,左上角的.
pt2 – 另一个顶点,右下角的.
rec – 确定矩形的另一种方式,给左上角坐标和长宽
color – 指定矩形的颜色或亮度(灰度图像),scalar(255,0,255)既可指定.
thickness – 矩形边框的粗细. 负值(like CV_FILLED)表示要画一个填充的矩形
lineType – 边框线型. (8 (or 0) - 8-connected line(8邻接)连接 线。4 - 4-connected line(4邻接)连接线。CV_AA - antialiased 线条。)
shift –坐标点的小数点位数
(4)画圆cv::circle
void circle(Mat&img, Point center, intradius, const Scalar&color,intthickness=1, intlineType=8, intshift=0)
img – 要画圆的那个矩形.
center – 圆心坐标.
radius – 半径.
color – 圆边框颜色,scalar类型的
thickness – 正值表示圆边框宽度. 负值表示画一个填充圆形
lineType – 圆边框线型
shift – 圆心坐标和半径的小数点位数
(5)画填充cv::fillPoly
(6)画折线PolyLine
void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
Parameters:
img – 折线所在图像.
pts – 折线中拐点坐标指针.
npts – 折线拐点个数指针.
ncontours – 折线线段数量.
isClosed – 折线是否闭合.
color – 折线颜色.
thickness – 折线宽度.
lineType – 线型.
shift – 顶点坐标小数点位数.
1.3绘制文本
putText函数
void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
img – 显示文字所在图像.
text – 待显示的文字.
org – 文字在图像中的左下角 坐标.
font – 字体结构体.
fontFace – 字体类型, 可选择字体:FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, orFONT_HERSHEY_SCRIPT_COMPLEX,以上所有类型都可以配合 FONT_HERSHEY_ITALIC使用,产生斜体效果。
fontScale – 字体大小,该值和字体内置大小相乘得到字体大小
color – 文本颜色
thickness – 写字的线的粗细,类似于0.38的笔尖和0.5的笔尖
lineType – 线性.
bottomLeftOrigin – true, 图像数据原点在左下角. Otherwise, 图像数据原点在左上角.
科普:红色+绿色=黄色
红色+蓝色=紫色
蓝色+绿色=青色
红色+蓝色+绿色=白色
红色+绿色=黄色
红色+蓝色=紫色
蓝色+绿色=青色
红色+蓝色+绿色=白色
1.4随机数生成cv::RNG
Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//生成随意的颜色
生成高斯随机数gaussian (double sigma)
生成正态分布随机数uniform (int a, int b)
2.模糊图像
2.1模糊原理
Smooth/Blur 是图像处理中最简单和常用的操作之一使用该操作的原因之一就为了给图像预处理时候减低噪声使用Smooth/Blur操作其背后是数学的卷积计算通常这些卷积算子计算都是线性操作,所以又叫线性滤波
滤波方式:均值滤波(取平均值);高斯滤波(高斯核函数)中值滤波(椒盐噪声抑制)双边滤波
均值滤波:blur(src1, dst, Size(3, 3), Point(-1, -1));//均值滤波
高斯滤波:GaussianBlur(src1,dst, Size(15, 15), 1, 1);//高斯滤波
中值滤波:medianBlur( src1, dst, 5);//中值滤波
双边滤波:bilateralFilter(src1, dst, 15, 70, 3);//双边滤波

均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重;高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同;高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
相关API
均值模糊
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));//Point(-1,-1))不要去改
例子:blur(src1, dst, Size(15, 15), Point(-1, -1));//均值模糊
高斯模糊
-GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
Size(x, y), x, y 必须是正数而且是奇数
sigmax, sigmay:横波和滤波的大小;
Ksize为高斯滤波器模板大小
例子:GetGaussianKernel(gaus, 3, 1); //生成33 大小高斯卷积核,Sigma=1;
中值模糊
medianBlur(Mat src, Mat dest, ksize)
双边模糊
bilateralFilter(src, dest, d=15, 150, 3);
15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
150 – sigma color 决定多少差值之内的像素会被计算
3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
中值模糊的ksize大小必须是大于1而且必须是奇数。
3.膨胀和腐蚀
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html
形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀能实现多种多样的功能,主要如下:
消除噪声
分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域
求出图像的梯度
膨胀:腐蚀:具体参照上面博主
其实膨胀对外视觉感官就是黑色部分窄了;腐蚀就是感觉变粗了许多;
相关的API
getStructuringElement(int shape, Size ksize, Point anchor);形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE);大小;锚点 默认是Point(-1, -1)意思就是中心像素
图像的膨胀##################################################
dilate(src, dst, kernel)
Mat element=getStructuringElement(MORPH_RECT, Size(5,5)); // 定义描述子形状、大小
cvtColor(Img, gray, COLOR_RGB2GRAY ); //将图像转化为灰度图像
dilate(gray, gray, element);//进行膨胀
图像的腐蚀(以下的博客参考)##################################
https://blog.csdn.net/qq_37764129/article/details/81205713
Mat element=getStructuringElement(MORPH_RECT, Size(5,5)); // 定义描述子形状、大小
cvtColor(Img, gray, COLOR_RGB2GRAY ); //将图像转化为灰度图像
erode(gray, gray, element);//进行腐蚀
动态调整结构元素大小
TrackBar – createTrackbar(const String & trackbarname, const String winName, int
value, int count, Trackbarcallback func, void* userdata=0)
其中最中要的是 callback 函数功能。如果设置为NULL就是说只有值update,但是不会调用callback的函数。
4.形态学操作
4.1开操作:先腐蚀后膨胀
主要是去掉小的对象,背景是黑色
4.2闭操作:先膨胀后腐蚀
主要用于填充比较小的洞;
形态学梯度
膨胀减去腐蚀又称为基本梯度
顶帽:原图像与开操作之间的差值图像
黑帽:闭运算图像与源图像之间的差值
形态学操作的应用–提取水平与垂直直线
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。
提取步骤:输入图像彩色图像 imread;转换为灰度图像 – cvtColor;转换为二值图像 adaptiveThreshold
定义结构元素:开操作 (腐蚀+膨胀)提取 水平与垂直线
转换为二值图像 – adaptiveThreshold
adaptiveThreshold(Mat src, // 输入的灰度图像,Mat dest, // 二值图像,double maxValue, // 二值图像最大值,int adaptiveMethod // 自适应方法,只能其中之一 –// ADAPTIVE_THRESH_MEAN_C ,ADAPTIVE_THRESH_GAUSSIAN_C,int thresholdType,// 阈值类型,int blockSize, // 块大小,double C // 常量C 可以是正数,0,负数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值