-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmask.cpp
65 lines (47 loc) · 1.45 KB
/
mask.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "mask.hpp"
#define NEIGH_TYPE 4
#define STD_MAX 255
double euclDis(Mat& im, int iA, int jA, int iB, int jB)
{
double sumDif = 0;
for (int k=0; k<im.channels(); k++)
sumDif+= ((im.at<uchar>(iA, jA+k))-(im.at<uchar>(iB, jB+k))) *
((im.at<uchar>(iA, jA+k))-(im.at<uchar>(iB, jB+k)));
return sqrt(sumDif);
}
int sum(Mat& im, int i, int j)
{
int sum=0;
for (int k=0; k<im.channels(); k++)
sum+=im.at<uchar>(i, j+k);
return sum;
}
void dfs(Mat& im, Mat& mask, int i, int j, char ** movement, double threshold)
{
for (int k=0; k<im.channels(); k++) mask.at<uchar>(i, j+k)=0;
int nextI, nextJ;
for (int aux=0; aux<NEIGH_TYPE; aux++){
nextI=i+movement[aux][0]; nextJ=j+(movement[aux][1]*im.channels());
if (validPos(nextI, nextJ, im.rows, im.cols*im.channels()) && euclDis(im, i, j, nextI, nextJ) < threshold
&& sum(mask, nextI, nextJ)!=0)
dfs(im, mask, nextI, nextJ, movement, threshold);
}
}
Mat generateMask(Mat& im, double threshold)
{
Mat filtered, mask;
bilateralFilter(im, filtered, 12, 120, 120, BORDER_DEFAULT);
mask = Mat(filtered.rows, filtered.cols, CV_8UC3);
mask.setTo(cv::Scalar(STD_MAX, STD_MAX, STD_MAX));
char ** movement = createMov(NEIGH_TYPE);
dfs(filtered, mask, 0, 0, movement, threshold);
freeMov(movement, NEIGH_TYPE);
return mask;
}
void applyMask(Mat& im, Mat& mask)
{
for (int i=0; i<im.rows; i++)
for (int j=0; j<im.cols*im.channels(); j++)
if (mask.at<uchar>(i, j)==0)
im.at<uchar>(i, j)=0;
}