漫水填充
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;
}