OpenCV学习笔记基础篇(十):漫水填充、图片尺寸缩放

前言:

笔者目前在校本科大二,有志于进行计算机视觉、计算机图形学方向的研究,准备系统性地、扎实的学习一遍OpenCV的内容,故记录学习笔记,同时,由于笔者同时学习数据结构、机器学习等知识,会尽量根据自己的理解,指出OpenCV的应用,并在加上自己理解的前提下进行叙述。
若有不当之处,希望各位批评、指正。


本篇学习内容:

1.漫水填充
2.图片尺寸缩放


1.漫水填充

摘自《OpenCV3编程入门》:
漫水填充是一种用特定的颜色填充连通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法。漫水填充经常被用来标记或分离图像的一部分,以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。

用floodFill()函数进行漫水填充:

int cv::floodFill	(	
InputOutputArray 	image,	//原图
InputOutputArray 	mask,	//掩码(在另一版本的重载中,没有此参数)
Point 	seedPoint,			//起始坐标点
Scalar 	newVal,				//重绘的新值
Rect * 	rect = 0,			//将要重绘的区域的最小边界矩形区域
Scalar 	loDiff = Scalar(),	//当前观察像素值和种子像素值之间的最大负差
Scalar 	upDiff = Scalar(),	//当前观察像素值和种子像素值之间的最大正差
int 	flags = 4 			//操作标志符
)	

floodFill()有一个重载版本,其各参数和此版本一样,只少了一个mask参数。所以,在使用floodFill()时,可以不传入mask。
下面对某些参数进行进一步说明:
mask:掩码图像。值得一提的是mask的宽、高需要比原图多2个像素。
rect : Optional output parameter set by the function to the minimum bounding rectangle of the repainted domain.
直译:重新绘制区域的最小矩形边框。
flags : Operation flags. The first 8 bits contain a connectivity value. The default value of 4 means that only the four nearest neighbor pixels (those that share an edge) are considered. A connectivity value of 8 means that the eight nearest neighbor pixels (those that share a corner) will be considered. The next 8 bits (8-16) contain a value between 1 and 255 with which to fill the mask (the default value is 1). For example, 4 | ( 255 << 8 ) will consider 4 nearest neighbours and fill the mask with a value of 255. The following additional options occupy higher bits and therefore may be further combined with the connectivity and mask fill values using bit-wise or (|), see FloodFillFlags.
此参数分为3个部分。
前八位是一个连通性的值,可选4或8,4代表填充算法只考虑当前像素水平和垂直方向的像素点,8代表不仅考虑水平和垂直方向,还会考虑对角方向的像素点。
中间八位的值是用来填充掩码的值。范围可以从1-255。
后八位是标识符。有2个标识符可选。
FLOODFILL_FIXED_RANGE:如果设置,算法会考虑当前像素和种子像素的差,否则考虑当前像素和相邻像素的差。这是由于漫水填充给了2种算法导致的。
在这里插入图片描述
如果不设置FLOODFILL_FIXED_RANGE,就是1,3情况。如果设置了,就是2,4情况。
FLOODFILL_MASK_ONLY :如果设置,函数不会改变原始图像,而是填充掩码图像。
例:我想设置4连通,以100填充掩码,不改变原始图像,那我可以让flag = 4|(100<<8)|FLOODFILL_MASK_ONLY
下面是一个floodFill()的例子:

Mat src = imread("E:/program/image/1.jpg");
//Mat mask = Mat::zeros(src.rows + 2, src.cols + 2, CV_8UC1);
Mat mask;
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(src, mask, MORPH_GRADIENT, element);
cvtColor(mask, mask,COLOR_BGR2GRAY);
copyMakeBorder(mask, mask, 1, 1, 1, 1, 0, Scalar(255, 255, 255));
for (int i = 0; i < mask.rows; i++) {
	for (int j = 0; j < mask.cols; j++) {
		if (mask.at<uchar>(i, j) < 20) {
			mask.at<uchar>(i, j) = 0;
		}
	}
}
imshow("src", src);
imshow("mask before", mask);
floodFill(src, mask,Point(100, 100), Scalar(155, 255, 55),0, Scalar(20, 20, 20), Scalar(20, 20, 20),4|(100<<8)| FLOODFILL_FIXED_RANGE);
imshow("dst", src);
imshow("mask after", mask);
waitKey();
return 0;

前篇说过,形态学梯度操作可以获得图片的边缘。我们可以通过此操作来让floodFill()不对图像边缘轮廓进行重绘。而形态学梯度操作后所得图像大片区域虽然是深色,但并不为0。所以我遍历图像,将像素值小于20的像素都设为0。随后以此为掩码进行floodFill()操作。
如果你不想这么麻烦,也可以:

Mat mask = Mat::zeros(src.rows + 2, src.cols + 2, CV_8UC1);

这样可以生成一个全为0的掩码图片。

下面是上述代码(使用形态学梯度操作的mask)的效果图:
在这里插入图片描述
在这里插入图片描述

2.图片尺寸缩放

用resize()函数进行图片尺寸缩放。

void cv::resize	(	
InputArray 	src,	//输入图像
OutputArray dst,	//输出图像
Size 	dsize,		//输出图像大小
double 	fx = 0,		//沿水平轴的缩放系数
double 	fy = 0,		//沿垂直轴的缩放系数
int 	interpolation = INTER_LINEAR //插值方式
)	

interpolation:插值方式
在这里插入图片描述
另外,如果fx或fy设置为0,OpenCV会自动计算:
在这里插入图片描述

参考文献:

  1. OpenCV官方文档:https://docs.opencv.org/4.x/
  2. 《OpenCV3编程入门》毛星云、冷雪飞等编著
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值