opencv中一些功能函数

漫水填充


int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect *rc = 0, Scalar loDIff = Scalar(), Scalar upDiff = Scalar(), int flags = 4)
int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect *rc = 0, Scalar loDIff = Scalar(), Scalar upDiff = Scalar(), int flags = 4)

floodFill 功能类似ps里的魔棒工具,就是把颜色相近的区域填充成指定颜色

第二个版本比第一个版本的多了个掩模参数,在第二个参数位置,可以说是第一个版本的强化版

下面只说第二个版本

参数:

1  待处理图像

2  掩模,这个掩模应符合如下要求,也可以不用这个参数,直接使用版本一

8位单通道

长宽均比原始图像大2

用零初始化

注意,原始图像像素的坐标若为(x,y),在掩模中因为(x+1, y+1)

3  Scalar类型,颜色,选择区域填充的颜色

4  Point类型,种子像素,选择的区域围绕这个点展开

5  Rect类型,选择的区域只能在这个范围内,默认全图

6  Scalar 类型,差别的下限,也就是最多能低多少

7  Scalar 类型,差别的上限,也就是最多能高多少

8  int类型,是个标志

低8位,4或8,默认4,用于控制连通性,为4表示算法只考虑当前像素的上下左右四个方向,为8表示算法考虑当前像素周围的全部8个像素

高16位,可以设置两个功能

FLOODFILL_FIXED_RANGE   在16位,如果设置了这个功能,表示算法考虑当前像素和种子像素之差,否则考虑当前像素与周围像素之差

FLOODFILL_MASK_ONLY        在17位,如果设置了这个功能,表示算法只填充掩模,不改变原图,这个标志只对第二个版本有效

中间8位,表示填充掩模的颜色,全0时自动用全1代替


图像缩放


void  resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)


用于缩放图像

1 源图像

2 输出图像

3 缩放后尺寸,如果为0,会通过4,5自动计算

4 宽度缩放倍数,如果为0,会通过3自动计算

5 高度缩放倍数,如果为0,会通过3自动计算

6 插值方式,有默认值,可选方式

INTER_NEAREST        = 0,
    INTER_LINEAR         = 1,
    INTER_CUBIC          = 2,
    INTER_AREA           = 3,
    INTER_LANCZOS4       = 4

没仔细研究过,默认是INTER_LINEAR(线性),放大图像用INTER_LINEAR(推荐)或INTER_CUBIC,缩小用INTER_AREA


void pyrUp

void pyrDown


阈值化


void threshold


void adaptiveThreshold


#include <core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

Mat ma1;

Mat ma2;

Mat ma3;

Mat ma4;

Mat ma5;

int thresh=0;
int blocksize = 0;
int type = 1;
int adatype = 1;
int C = 0;

void fill(int event, int x, int y, int flags, void *param)
{
	Rect rc;

	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN:
		floodFill(ma1, Point(x, y), Scalar(155, 255, 50), &rc, Scalar(5, 5, 5), Scalar(5, 5, 5));
		break;

	}
	imshow("im2", ma1);
	INTER_LINEAR;
}

void on_adaadj(int, void *)
{
	switch (adatype)
	{
	case 1:
		adaptiveThreshold(ma3, ma5, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 2 * (blocksize+1) + 1, C);
		break;
	case 2:
		adaptiveThreshold(ma3, ma5, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 2 * (blocksize+1) + 1, C);
		break;
	}

	imshow("im5", ma5);
}

void on_adaC(int, void *)
{
	switch (adatype)
	{
	case 1:
		adaptiveThreshold(ma3, ma5, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 2 * (blocksize + 1) + 1, C);
		break;
	case 2:
		adaptiveThreshold(ma3, ma5, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 2 * (blocksize + 1) + 1, C);
		break;
	}

	imshow("im5", ma5);
}

void on_adj(int, void*)
{
	switch (type)
	{
	case 1:
		threshold(ma3, ma4, thresh, 255, THRESH_BINARY);
		break;

	case 2:
		threshold(ma3, ma4, thresh, 255, THRESH_BINARY_INV);
		break;

	case 3:
		threshold(ma3, ma4, thresh, 255, THRESH_TRUNC);
		break;

	case 4:
		threshold(ma3, ma4, thresh, 255, THRESH_TOZERO);
		break;

	case 5:
		threshold(ma3, ma4, thresh, 255, THRESH_TOZERO_INV);
		break;
	}

	imshow("im4", ma4);
}

int main()
{
	ma1 = imread("1.png");
	
	imshow("im1", ma1);

	Rect rc;

	floodFill(ma1, Point(30, 50), Scalar(155, 255, 50), &rc, Scalar(5, 5, 5), Scalar(5, 5, 5));

	imshow("im2", ma1);

	setMouseCallback("im2", fill, NULL);

	ma2 = imread("2.png");

	imshow("im changing", ma2);

	ma3 = imread("1.png");

	cvtColor(ma3, ma3, COLOR_BGR2GRAY);

	imshow("im4", ma3);
	imshow("im5", ma3);

	int com;
	bool bBusy = true;
	
	createTrackbar("слох", "im4", &thresh, 255, on_adj, NULL);

	createTrackbar("blocksize", "im5", &blocksize, 100, on_adaadj, NULL);
	
	createTrackbar("C", "im5", &C, 100, on_adaC, NULL);

	while (bBusy)
	{
		com = waitKey(10);

		switch (com)
		{
		case 27:
		case 'q':
			bBusy = false;
			break;

		case 's':
			if (ma2.cols / 2 != 0)
			{
				printf("resize smaller\n");
				resize(ma2, ma2, Size(ma2.cols * 0.9, ma2.rows * 0.9));

				imshow("im changing", ma2);
			}
			break;

		case 'd':

			{
				printf("resize bigger\n");
				resize(ma2, ma2, Size(ma2.cols * 2, ma2.rows * 2));

				imshow("im changing", ma2);
			}
			break;

		case 'f':
			if (ma2.cols / 2 != 0)
			{
				printf("pyrDown smaller\n");
				pyrDown(ma2, ma2, Size(ma2.cols / 2, ma2.rows / 2));

				imshow("im changing1", ma2);
			}
			break;

		case 'g':

			{
				printf("pyrUp bigger\n");
				pyrUp(ma2, ma2, Size(ma2.cols * 2, ma2.rows * 2));

				imshow("im changing1", ma2);
			}
			break;

		case 'r':
			printf("reset\n");
			ma2 = imread("2.png");
			imshow("im changing", ma2);
			imshow("im changing1", ma2);
			break;

		case '1':
		case '2':
			adatype = com - '0';
		case '3':
		case '4':
		case '5':
			type = com - '0';
			break;

		}
	}

	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值