博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《图像处理实例》 之 局部极值提取
阅读量:4287 次
发布时间:2019-05-27

本文共 20334 字,大约阅读时间需要 67 分钟。


局部极值提取算法

这是的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件!

有需要C++的朋友,可有留邮箱,经测试和改进的版本! 


算法原理:(按照程序思路来,当然其中很多可以改进的地方)

    第一步:    

        先进行距离变换(这类问题都是要通过几何操作进行,距离变换就是几何距离)

    第二步:

        先找全局可能最大值,然后对图像进行标记

        全局可能最大值是基础,3X3核在图像上滑动去找全局可能最大值。标记是为了掩膜操作更方便,你看opencv很多函数都有掩膜,PS上面也有那个白色的膜。     

        图片结果是:背景和最大值标记3,前景标记1,图像边界标记0(为了防止越界)         貌似下面的图片显示有问题,matploylib的显示有时候确实有问题,Debug的时候就和显示不一样,没关系这一步比较简单。

    第三步:

        对全局可能最大值进行排除,这一步是程序核心!这里以求最大值为例,最小值相反。

          •   首先对找到的最大值进行排序--从大到小
          •   按照从大到小的顺序去寻找每个最大值的领地
          •   领地按照“目标范围”和“目标深度”两个原则,具体表现形式为:“不重合”、“不包括”、“领主大于等于领地”             

          下面以图说明两个大原则:

            目标范围:

                下图A1这个最大最他所占领的范围由用户输入,假设半径为y,则 x1 = x2 = y ,x1和x2的范围就是A1的范围,P点虽然很低,但是不属于A1的范围,所以不去占领。

                 目标深度:

                                 下图A1的深度也又用户输入,假设输入为y,则 y1 = y,高度确定之后,那么P点虽然也在山脊上,但是不会被A1所占领。

                

          下面以图为例进一步说明三个具体形式:

          注释:三个具体形式是建立在两个原则之上的,所以理解上面是结局算法的基础。

            不重合形式:

                下图A1和A2有领土纠纷,但是A1峰值高所以先进行领地划分,当A2进行领地划分的时候一旦接触A1的领地就立马被消灭,最后只剩A1的存在。

            不包括形式:

                       下图A1先进行领土划分,过程中直接把A2消灭了,不存在A2的领土划分

            领主大于等于领地形式,也可以叫同等峰值先来先得形式:

                  由于A1先进行领土划分,所以后面的都被消灭了,读到这里你会发现这个程序的BUG,后面再详细谈论这一点

 

                 目标深度原则

                要确定和你预定的深度是不是符合,比如你想要山峰之间的深度都是在10cm以上,那么有些不符合的就得去除,去除原则肯定矮的GG

注释:大佬的程序没有几何距离,还有部分Bug,部分经过修正了。

 

 程序有待改进:

         这部分可以通过处理---“同样的峰值且山脉相连”的一类极值点,对其平均、覆盖范围最多等操作取一个中间的值!

         由于python用的不熟练,而且现在时间太晚了脑子转不动,以后用C++写的时候再改进这一点。

2017.10.17更新:

      1.对上面第二步:可能最大值进行补充

        请看下面这个图,中间位置肯定不是最大值区域,而且通过上面的第三步过滤也是没办法过滤的,具体看上面原理就知道了,所以需要在第二步进行过滤!

        本程序利用如下方法:

          A.每一层的最大值都大于外面一层,sum[0]>=sum[1] && sum[1]>sum[2] && sum[2]>sum[3],这里使用到9X9的内核

          B.记录每一层最大值出现的位置X0和X1,然后最大值的距离(abs(x0.x - x1.x) <= 2 && abs(x0.y - x1.y) <= 2)小于等于2,这里不严谨,因为每层最大值不止一个。

          C.记录最大值出现的数量n_count >= 3

1        float sum[4] = { 0 };//存储最大值进行对比、在这里说不清楚看博客2017.10.17更新 2             sum[0] = img[3][j]; 3             Point x0 = Point(0, 0); 4             Point x1 = Point(0, 0); 5             uchar n_count = 0; 6             for (int m = 2; m < 5; m++) 7             { 8                 for (int n = -1; n < 2; n++) 9                 {10                     if (m == 3 && n == 0) continue;11                     sum[1] = sum[1] < img[m][j + n] ? img[m][j + n] : sum[1];12                     x0 = sum[0] == img[m][j + n] ? Point(m, n) : x0;13                     n_count = sum[0] == img[m][j + n] ? n_count+1 : n_count;14                     //flag = img[3][j + 0] < img[m][j + n] ? true : flag;//如果目标像素小于周围任何一个像素就说明这个一定不是最大值15                 }16             }17             for (int m = 1; m < 6; m++)18             {19                 for (int n = -2; n < 3; n++)20                 {21                     if (2 <= m && m <= 4 && -1 <= n && n <= 1) continue;22                     sum[2] = sum[2] < img[m][j + n] ? img[m][j + n] : sum[2];23                     x1 = sum[0] == img[m][j + n] ? Point(m, n) : x1;24                     n_count = sum[0] == img[m][j + n] ? n_count+1 : n_count;25                     //flag = img[3][j + 0] < img[m][j + n] ? true : flag;//如果目标像素小于周围任何一个像素就说明这个一定不是最大值26                 }27             }28             for (int m = 0; m < 7; m++)29             {30                 for (int n = -3; n < 4; n++)31                 {32                     sum[3] = sum[3] < img[m][j + n] && !(1 <= m && m <= 5 && -2 <=n && n <= 2) ? img[m][j + n] : sum[3];33                     //flag = img[3][j+0] < img[m][j + n] ? true : flag;//如果目标像素小于周围任何一个像素就说明这个一定不是最大值34                 }35             }36             x1 = (x1.x == 0 && x1.y == 0) || n_count >= 3 ? x0 : x1;//判断是否存在5X5的最大值(和目标点相同)37             int tmp = sum[0] >= sum[1] && sum[1] >= sum[2] && sum[2] >= sum[3] && (abs(x0.x - x1.x) <= 2 && abs(x0.y - x1.y) <= 2)38                 ? 0 : FillBlock(src, mask_tmp, Point(j, i));//tmp没意义,就是为了调用后面的函数而已39         }

       2.对第三步进行补充

        A.搜索过程遇到边界,那就把这个最大值点去除if (img[i][fill_point[count].x + j] == 2 || msk[i][fill_point[count].x + j] == 0) max_point[k].data = 1;

      3.效果图

        注释:满足一个条件就判定为最大值!

           1 Find_Max(img, mask,0, 5000); 

               1 Find_Max(img, mask,5000, 0); 

               1 Find_Max(img, mask,5000, 5000); 

               1 Find_Max(img, mask,10, 20); 

               1 Find_Max(img, mask,10, 50); 

1 import scipy.ndimage as ndimg  2 import numpy as np  3 from numba import jit  4 import cv2  5   6 def neighbors(shape):  7     dim = len(shape)  8     block = np.ones([3] * dim)  9     block[tuple([1] * dim)] = 0 10     idx = np.where(block > 0) 11     idx = np.array(idx, dtype=np.uint8).T 12     idx = np.array(idx - [1] * dim) 13     acc = np.cumprod((1,) + shape[::-1][:-1]) 14     return np.dot(idx, acc[::-1]) 15  16  17 @jit  # trans index to r, c... 18  19 def idx2rc(idx, acc): 20     rst = np.zeros((len(idx), len(acc)), dtype=np.int16) 21     for i in range(len(idx)): 22         for j in range(len(acc)): 23             rst[i, j] = idx[i] // acc[j] 24             idx[i] -= rst[i, j] * acc[j] 25     return rst 26  27  28 #@jit  # fill a node (may be two or more points) 29  30 def fill(img, msk, p, nbs, buf): 31     msk[p] = 3 32     buf[0] = p 33     back = img[p] 34     cur = 0 35     s = 1 36     while cur < s: 37         p = buf[cur] 38         for dp in nbs: 39             cp = p + dp 40             if img[cp] == back and msk[cp] == 1: 41                 msk[cp] = 3 42                 buf[s] = cp 43                 s += 1 44                 if s == len(buf): 45                     buf[:s - cur] = buf[cur:] 46                     s -= cur 47                     cur = 0 48         cur += 1 49     #msk[p] = 3 50  51  52 #@jit  # my mark 53  54 def mark(img, msk, buf, mode):  # mark the array use (0, 1, 2) 55     omark = msk      56     nbs = neighbors(img.shape) 57     idx = np.zeros(1024 * 128, dtype=np.int64) 58     img = img.ravel()  # 降维 59     msk = msk.ravel()  # 降维 60     s = 0 61     for p in range(len(img)): 62         if msk[p] != 1: continue   63         flag = False              64         for dp in nbs: 65             if mode and img[p + dp] > img[p]:  66                 flag = True 67                 break 68             elif not mode and img[p + dp] < img[p]: 69                 flag = True 70                 break 71          72         if flag : continue 73         else    : fill(img, msk, p, nbs, buf) 74         idx[s] = p 75         s += 1 76         if s == len(idx): break 77     plt.imshow(omark, cmap='gray') 78     return idx[:s].copy() 79  80  81  82 def filter(img, msk, idx, bur, tor, mode): 83     omark = msk   84     nbs = neighbors(img.shape) 85     acc = np.cumprod((1,) + img.shape[::-1][:-1])[::-1] 86     img = img.ravel() 87     msk = msk.ravel() 88  89     arg = np.argsort(img[idx])[::-1 if mode else 1]  90  91     for i in arg: 92         if msk[idx[i]] != 3:     93             idx[i] = 0 94             continue 95         cur = 0 96         s = 1 97         bur[0] = idx[i]  98         while cur < s: 99             p = bur[cur]100             if msk[p] == 2:     101                 idx[i] = 0102                 break103 104             for dp in nbs:105                 cp = p + dp106                 if msk[cp] == 0 or cp == idx[i] or msk[cp] == 4: continue107                 if mode and img[cp] < img[idx[i]] - tor: continue108                 if not mode and img[cp] > img[idx[i]] + tor: continue109                 bur[s] = cp110                 s += 1111                 if s == 1024 * 128:112                     cut = cur // 2113                     msk[bur[:cut]] = 2114                     bur[:s - cut] = bur[cut:]115                     cur -= cut116                     s -= cut117 118                 if msk[cp] != 2: msk[cp] = 4    119             cur += 1120         msk[bur[:s]] = 2    121         #plt.imshow(omark, cmap='gray')122 123     return idx2rc(idx[idx > 0], acc)124 125 126 def find_maximum(img, tor, mode=True):127     msk = np.zeros_like(img, dtype=np.uint8)  128     msk[tuple([slice(1, -1)] * img.ndim)] = 1  129     buf = np.zeros(1024 * 128, dtype=np.int64)130     omark = msk131     idx = mark(img, msk, buf, mode)132     plt.imshow(msk, cmap='gray')133     idx = filter(img, msk, idx, buf, tor, mode)134     return idx135 136 137 if __name__ == '__main__':138     from scipy.misc import imread139     from scipy.ndimage import gaussian_filter140     from time import time141     import matplotlib.pyplot as plt142 143     img = cv2.imread('123.png')144     img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)145     ret2, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)146     img[:] = ndimg.distance_transform_edt(img)147     plt.imshow(img, cmap='gray')148     pts = find_maximum(img, 20, True)149     start = time()150     pts = find_maximum(img, 10, True)151     print(time() - start)152     plt.imshow(img, cmap='gray')153     plt.plot(pts[:, 1], pts[:, 0], 'y.')154     plt.show()

 C++版本

 老版本、不稳定,可以看思路

1 //---fill black value  2 int FillBlock(Mat src, Mat &mask, Point center)  3 {  4     uchar back = src.at
(center.y, center.x); 5 vector
fill_point; 6 int count = 0, count_mount = 1; 7 fill_point.push_back(center); 8 while (count < count_mount) 9 { 10 vector
img; 11 vector
msk; 12 for (int i = -1; i < 2; i++) 13 { 14 img.push_back(src.ptr
(fill_point[count].y + i)); 15 msk.push_back(mask.ptr
(fill_point[count].y + i)); 16 } 17 for (size_t i = 0; i < 3; i++) 18 { 19 for (int j = -1; j < 2; j++) 20 { 21 if (img[i][fill_point[count].x + j] == back && !(j == 0 && i == 1) && msk[i][fill_point[count].x + j] == 255) 22 { 23 fill_point.push_back(Point(fill_point[count].x + j, fill_point[count].y + i - 1)); 24 msk[i][fill_point[count].x + j] = 1; 25 } 26 } 27 } 28 msk[1][fill_point[count].x] = 1; 29 count_mount = fill_point.size() - 1; 30 fill_point.erase(fill_point.begin()); 31 } 32 return 0; 33 } 34 //---cal mask 35 //---@_src 36 //---@mask 37 void MaskImage(InputArray _src, Mat &mask) 38 { 39 Mat src = _src.getMat(),mask_tmp = Mat::zeros(src.size(), CV_8UC1); 40 mask_tmp.setTo(255); 41 Mat rows = Mat::zeros(Size(src.cols, 1), CV_8UC1), cols = Mat::zeros(Size(1, src.rows), CV_8UC1); 42 Mat src_rows_beg = mask_tmp.row(0); 43 Mat src_rows_end = mask_tmp.row(src.rows - 1); 44 Mat src_cols_beg = mask_tmp.col(0); 45 Mat src_cols_end = mask_tmp.col(src.cols - 1); 46 rows.copyTo(src_rows_beg); rows.copyTo(src_rows_end); 47 cols.copyTo(src_cols_beg); cols.copyTo(src_cols_end); 48 for (size_t i = 1; i < src.rows-1; i++) 49 { 50 uchar *img0 = src.ptr
(i - 1); 51 uchar *img = src.ptr
(i); 52 uchar *img1 = src.ptr
(i + 1); 53 uchar *msk = mask_tmp.ptr
(i); 54 for (size_t j = 1; j < src.cols-1; j++) 55 { 56 bool flag = false; 57 //msk[j] = img[j] == 0 ? 0 : msk[j]; 58 if (msk[j] != 255) continue; 59 flag = (img[j] < img[j - 1] || img[j] < img[j + 1] 60 || img[j] < img0[j] || img[j] < img0[j - 1] 61 || img[j] < img0[j + 1] || img[j] < img1[j] 62 || img[j] < img1[j - 1] || img[j] < img1[j + 1]) 63 ? true : false; 64 int tmp = flag == true ? FillBlock(src, mask_tmp, Point(j, i)) : 0; 65 } 66 } 67 mask = mask_tmp.clone(); 68 } 69 //---filter parts max value 70 //---@ 71 //---@ 72 //---@gap 73 //---@radius 74 75 vector
Find_Max(InputArray _src, Mat&mask,int gap,int radius) 76 { 77 Mat src = _src.getMat(); 78 79 typedef struct MyStruct 80 { 81 Point position; 82 float data; 83 }MyStruct; 84 85 MaskImage(src, mask); 86 vector
max_point; 87 for (size_t i = 0; i < src.rows; i++) 88 { 89 uchar *img = src.ptr
(i); 90 uchar *msk = mask.ptr
(i); 91 for (size_t j = 0; j < src.cols; j++) 92 { 93 if (msk[j] != 255) continue; 94 MyStruct my_struct; 95 my_struct.data = img[j]; 96 my_struct.position = Point(j, i); 97 max_point.push_back(my_struct); 98 } 99 }100 for (size_t i = 0; i < max_point.size(); i++)101 {102 for (size_t j = i; j < max_point.size(); j++)103 {104 MyStruct temp;105 if (max_point[i].data <= max_point[j].data)106 {107 if (max_point[j].data == 0) continue;108 temp = max_point[j];109 max_point[j] = max_point[i];110 max_point[i] = temp;111 }112 }113 }114 //---find max115 for (size_t k = 0; k < max_point.size(); k++)//---116 {117 uchar back = src.at
(max_point[k].position.y, max_point[k].position.x);118 vector
fill_point;119 int count = 0, count_mount = 1;120 fill_point.push_back(max_point[k].position);121 122 while (count < count_mount && max_point[k].data != 1)123 {124 vector
img;125 vector
msk;126 for (int i = -1; i < 2; i++)127 {128 img.push_back(src.ptr
(fill_point[count].y + i));129 msk.push_back(mask.ptr
(fill_point[count].y + i));130 }131 for (int i = 0; i < 3; i++)132 {133 for (int j = -1; j < 2; j++)134 {135 //---136 uchar x = pow((max_point[k].position.x - fill_point[count].x + j), 2); //(max_point[k].position.x - img[i][fill_point[count].x + j])*(max_point[k].position.x - img[i][fill_point[count].x + j]);137 uchar y = pow((max_point[k].position.y - (fill_point[count].y + i - 1)) , 2); // (max_point[k].position.y - img[i][fill_point[count].y + j])*(max_point[k].position.y - img[i][fill_point[count].x + j]);138 uchar distance = sqrt(x + y);139 if (img[i][fill_point[count].x + j] <= img[1][fill_point[count].x] - gap 140 || msk[i][fill_point[count].x + j] == 3141 || msk[i][fill_point[count].x + j] == 0142 || (j == 0 && i == 1)143 || distance >= radius) continue;144 if (img[i][fill_point[count].x + j] == 2) max_point[k].data = 1;145 msk[i][fill_point[count].x + j] = 3;146 fill_point.push_back(Point(fill_point[count].x + j, fill_point[count].y + i - 1));147 count_mount++;148 }149 }150 count++;151 } 152 if (max_point[k].data == 1)153 {154 for (size_t i = 0; i < fill_point.size(); i++)155 {156 mask.at
(fill_point[i]) = 1;157 }158 }159 else160 {161 for (size_t i = 0; i < fill_point.size(); i++)162 {163 mask.at
(fill_point[i]) = 2;164 }165 max_point[k].data = 255;166 mask.at
(max_point[k].position) = 255;167 }168 }169 }
View Code

C++版本:

2017.10.17更新

1 int FillBlock(Mat src, Mat &mask, Point center)  2 {  3     uchar back = src.at
(center.y, center.x); 4 vector
fill_point; 5 int count = 0, count_mount = 1; 6 fill_point.push_back(center); 7 while (count < count_mount) 8 { 9 vector
img; 10 vector
msk; 11 for (int i = -1; i < 2; i++) 12 { 13 img.push_back(src.ptr
(fill_point[count].y + i)); 14 msk.push_back(mask.ptr
(fill_point[count].y + i)); 15 } 16 for (size_t i = 0; i < 3; i++) 17 { 18 for (int j = -1; j < 2; j++) 19 { 20 if (img[i][fill_point[count].x + j] == back && !(j == 0 && i == 1) && msk[i][fill_point[count].x + j] == 255) 21 { 22 fill_point.push_back(Point(fill_point[count].x + j, fill_point[count].y + i - 1)); 23 msk[i][fill_point[count].x + j] = 1; 24 } 25 } 26 } 27 msk[1][fill_point[count].x] = 1; 28 count_mount = fill_point.size() - 1; 29 fill_point.erase(fill_point.begin()); 30 } 31 return 0; 32 } 33 34 void MaskImage(InputArray _src, Mat &mask) 35 { 36 Mat src = _src.getMat(),mask_tmp = Mat::zeros(src.size(), CV_8UC1); 37 mask_tmp.setTo(255); 38 Mat rows = Mat::zeros(Size(src.cols, 1), CV_8UC1), cols = Mat::zeros(Size(1, src.rows), CV_8UC1); 39 Mat src_rows_beg = mask_tmp.row(0); 40 Mat src_rows_end = mask_tmp.row(src.rows - 1); 41 Mat src_cols_beg = mask_tmp.col(0); 42 Mat src_cols_end = mask_tmp.col(src.cols - 1); 43 rows.copyTo(src_rows_beg); rows.copyTo(src_rows_end); 44 cols.copyTo(src_cols_beg); cols.copyTo(src_cols_end); 45 46 for (size_t i = 3; i < src.rows-3; i++) 47 { 48 vector
img; 49 uchar* msk = mask_tmp.ptr(i); 50 uchar* img1 = src.ptr(i); 51 for (int k = -3; k < 4; k++) 52 { 53 img.push_back(src.ptr
(k + i)); 54 } 55 for (size_t j = 3; j < src.cols-3; j++) 56 { 57 bool flag = false; 58 if (msk[j] != 255) continue; 59 float sum[4] = { 0 }; 60 sum[0] = img[3][j]; 61 Point x0 = Point(0, 0); 62 Point x1 = Point(0, 0); 63 uchar n_count = 0; 64 for (int m = 2; m < 5; m++) 65 { 66 for (int n = -1; n < 2; n++) 67 { 68 if (m == 3 && n == 0) continue; 69 sum[1] = sum[1] < img[m][j + n] ? img[m][j + n] : sum[1]; 70 x0 = sum[0] == img[m][j + n] ? Point(m, n) : x0; 71 n_count = sum[0] == img[m][j + n] ? n_count+1 : n_count; 72 //flag = img[3][j + 0] < img[m][j + n] ? true : flag;//如果目标像素小于周围任何一个像素就说明这个一定不是最大值 73 } 74 } 75 for (int m = 1; m < 6; m++) 76 { 77 for (int n = -2; n < 3; n++) 78 { 79 if (2 <= m && m <= 4 && -1 <= n && n <= 1) continue; 80 sum[2] = sum[2] < img[m][j + n] ? img[m][j + n] : sum[2]; 81 x1 = sum[0] == img[m][j + n] ? Point(m, n) : x1; 82 n_count = sum[0] == img[m][j + n] ? n_count+1 : n_count; 83 //flag = img[3][j + 0] < img[m][j + n] ? true : flag;//如果目标像素小于周围任何一个像素就说明这个一定不是最大值 84 } 85 } 86 for (int m = 0; m < 7; m++) 87 { 88 for (int n = -3; n < 4; n++) 89 { 90 sum[3] = sum[3] < img[m][j + n] && !(1 <= m && m <= 5 && -2 <=n && n <= 2) ? img[m][j + n] : sum[3]; 91 //flag = img[3][j+0] < img[m][j + n] ? true : flag; 92 } 93 } 94 x1 = (x1.x == 0 && x1.y == 0) || n_count >= 3 ? x0 : x1; 95 int tmp = sum[0] >= sum[1] && sum[1] >= sum[2] && sum[2] >= sum[3] && (abs(x0.x - x1.x) <= 2 && abs(x0.y - x1.y) <= 2) 96 ? 0 : FillBlock(src, mask_tmp, Point(j, i)); 97 } 98 } 99 mask = mask_tmp.clone();100 }101 102 vector
Find_Max(InputArray _src, Mat&mask,int gap,int radius)103 {104 Mat src = _src.getMat();105 106 typedef struct MyStruct107 {108 Point position;109 float data;110 }MyStruct;111 112 MaskImage(src, mask);113 vector
max_point;114 for (size_t i = 0; i < src.rows; i++)115 {116 uchar *img = src.ptr
(i);117 uchar *msk = mask.ptr
(i);118 for (size_t j = 0; j < src.cols; j++)119 {120 if (msk[j] != 255) continue;121 MyStruct my_struct;122 my_struct.data = img[j];123 my_struct.position = Point(j, i);124 max_point.push_back(my_struct);125 }126 }127 for (size_t i = 0; i < max_point.size(); i++)128 {129 for (size_t j = i; j < max_point.size(); j++)130 {131 MyStruct temp;132 if (max_point[i].data <= max_point[j].data)133 {134 if (max_point[j].data == 0) continue;135 temp = max_point[j];136 max_point[j] = max_point[i];137 max_point[i] = temp;138 }139 }140 }141 142 for (size_t k = 0; k < max_point.size(); k++)//---143 {144 uchar back = src.at
(max_point[k].position.y, max_point[k].position.x);145 vector
fill_point;146 int count = 0, count_mount = 1;147 fill_point.push_back(max_point[k].position);148 149 while (count < count_mount && max_point[k].data != 1)150 {151 vector
img;152 vector
msk;153 for (int i = -1; i < 2; i++)154 {155 img.push_back(src.ptr
(fill_point[count].y + i));156 msk.push_back(mask.ptr
(fill_point[count].y + i));157 }158 for (int i = 0; i < 3; i++)159 {160 for (int j = -1; j < 2; j++)161 {162 //---163 double x = pow((max_point[k].position.x - fill_point[count].x + j), 2); //(max_point[k].position.x - img[i][fill_point[count].x + j])*(max_point[k].position.x - img[i][fill_point[count].x + j]);164 double y = pow((max_point[k].position.y - (fill_point[count].y + i - 1)), 2); // (max_point[k].position.y - img[i][fill_point[count].y + j])*(max_point[k].position.y - img[i][fill_point[count].x + j]);165 int distance = sqrt(x + y);166 if (img[i][fill_point[count].x + j] <= img[0][fill_point[count].x] - gap 167 || msk[i][fill_point[count].x + j] == 3168 //|| msk[i][fill_point[count].x + j] == 0 169 || (j == 0 && i == 1)170 || distance >= radius) continue;171 if (img[i][fill_point[count].x + j] == 2 || msk[i][fill_point[count].x + j] == 0) max_point[k].data = 1;172 msk[i][fill_point[count].x + j] = 3;173 fill_point.push_back(Point(fill_point[count].x + j, fill_point[count].y + i - 1));174 count_mount++;175 }176 }177 count++;178 } 179 if (max_point[k].data == 1)180 {181 for (size_t i = 0; i < fill_point.size(); i++)182 {183 mask.at
(fill_point[i]) = 1;184 }185 }186 else187 {188 for (size_t i = 0; i < fill_point.size(); i++)189 {190 mask.at
(fill_point[i]) = 2;191 }192 max_point[k].data = 255;193 mask.at
(max_point[k].position) = 255;194 }195 }196 vector
print_wjy;197 for (size_t i = 0; i < mask.rows; i++)198 {199 uchar *msk = mask.ptr
(i);200 for (size_t j = 0; j < mask.cols; j++)201 {202 if (msk[j] == 255)203 print_wjy.push_back(Point(j, i));204 }205 206 }207 return print_wjy;208 }

转载地址:http://hntgi.baihongyu.com/

你可能感兴趣的文章
【Hive SQL】使用正则表达式做数据清洗
查看>>
学习笔记-集合框架
查看>>
学习笔记-散列表
查看>>
学习笔记-Map映射
查看>>
学习笔记-面向对象思想
查看>>
学习笔记-Java swing
查看>>
单元测试-生成Junit测试类
查看>>
POST编程代码实现
查看>>
关于【端口号被占用的问题的解决办法】
查看>>
FFmpeg视频剪辑拼接
查看>>
简单封装Http的Get和Post请求
查看>>
利用Lambda解决蓝桥杯【消除尾一】问题
查看>>
由size_t引发的思考
查看>>
QT水费管理系统 ——纯C++开发
查看>>
PHP调用科大讯飞语音服务
查看>>
mui.ajax使用注意事项
查看>>
repo简介
查看>>
父类指针访问子类私有对象
查看>>
Windows CMD.exe 系统找不到指定的路径
查看>>
SpringBoot电商项目实战 — 商品的SPU/SKU实现
查看>>