1. 程式人生 > >two Pass方法連通域檢測

two Pass方法連通域檢測

  1 #include "opencv2/imgproc/imgproc.hpp"
  2 #include "opencv2/highgui/highgui.hpp"
  3 #include <map>
  4 #include <cassert>
  5 #include <iostream>
  6 
  7 using namespace std;
  8 
  9 const int max_size = 1000;
 10 int parent[max_size] = { 0 };
 11 
 12 // 找到label x的根節點
 13 int Find(int
x, int parent[]) 14 { 15 assert(x < max_size); 16 int i = x; 17 while (0 != parent[i]) 18 i = parent[i]; 19 return i; 20 } 21 22 // 將label x 和 label y合併到同一個連通域 23 void Union(int x, int y, int parent[]) 24 { 25 assert(x < max_size && y < max_size);
26 int i = x; 27 int j = y; 28 while (0 != parent[i]) 29 i = parent[i]; 30 while (0 != parent[j]) 31 j = parent[j]; 32 if (i != j) 33 parent[i] = j; 34 } 35 36 cv::Mat twoPassConnectComponent(cv::Mat &binaryImg) 37 { 38 int imgW = binaryImg.cols;
39 int imgH = binaryImg.rows; 40 int channel = binaryImg.channels(); 41 int type = binaryImg.type(); 42 // first pass 43 int label = 0; 44 45 cv::Mat dst = cv::Mat::zeros(cv::Size(imgW, imgH), CV_32SC1); 46 for (int y = 0; y < imgH; y++) 47 { 48 for (int x = 0; x < imgW; x++) 49 { 50 if (binaryImg.at<uchar>(y, x) != 0) 51 { 52 int left = (x - 1 < 0) ? 0 : dst.at<int>(y, x - 1); 53 int up = (y - 1 < 0) ? 0 : dst.at<int>(y - 1, x); 54 55 if (left != 0 || up != 0) 56 { 57 if (left != 0 && up != 0) 58 { 59 dst.at<int>(y, x) = min(left, up); 60 if (left <= up) 61 Union(up, left, parent); 62 else if (up<left) 63 Union(left, up, parent); 64 } 65 else 66 dst.at<int>(y, x) = max(left, up); 67 } 68 else 69 { 70 dst.at<int>(y, x) = ++label; 71 } 72 } 73 } 74 } 75 76 //second pass 77 for (int y = 0; y < imgH; y++) 78 { 79 for (int x = 0; x < imgW; x++) 80 { 81 if (binaryImg.at<uchar>(y, x) != 0) 82 dst.at<int>(y, x) = Find(dst.at<int>(y, x), parent); 83 } 84 } 85 86 return dst; 87 } 88 89 cv::Scalar getRandomColor() 90 { 91 uchar r = 255 * (rand() / (1.0 + RAND_MAX)); 92 uchar g = 255 * (rand() / (1.0 + RAND_MAX)); 93 uchar b = 255 * (rand() / (1.0 + RAND_MAX)); 94 return cv::Scalar(b, g, r); 95 } 96 97 cv::Mat showColorLabel(cv::Mat label) 98 { 99 int imgW = label.cols; 100 int imgH = label.rows; 101 std::map<int, cv::Scalar> colors; 102 103 cv::Mat colorLabel = cv::Mat::zeros(imgH, imgW, CV_8UC3); 104 int *pLabel = (int*)label.data; 105 uchar *pColorLabel = colorLabel.data; 106 for (int i = 0; i < imgH; i++) 107 { 108 for (int j = 0; j < imgW; j++) 109 { 110 int idx = (i*imgW + j) * 3; 111 int pixelValue = pLabel[i*imgW + j]; 112 if (pixelValue > 0) 113 { 114 if (colors.count(pixelValue) <= 0) 115 { 116 colors[pixelValue] = getRandomColor(); 117 } 118 cv::Scalar color = colors[pixelValue]; 119 pColorLabel[idx + 0] = color[0]; 120 pColorLabel[idx + 1] = color[1]; 121 pColorLabel[idx + 2] = color[2]; 122 } 123 } 124 } 125 126 return colorLabel; 127 } 128 129 int main() 130 { 131 // 載入影象 132 string imageName = "data/source_images/logo.png"; 133 cv::Mat image = cv::imread(imageName, 1); 134 if (!image.data) 135 { 136 cout << "No image data" << endl; 137 getchar(); 138 return -1; 139 } 140 //轉為灰度圖 141 cv::cvtColor(image, image, CV_RGB2GRAY); 142 //閾值化,情景為255,背景為0 143 cv::Mat threshImg; 144 cv::threshold(image, threshImg, 200, 255, cv::THRESH_BINARY); 145 cv::bitwise_not(threshImg, threshImg); 146 147 //連通域檢測 two Pass方法標記影象 148 cv::Mat labelImg = twoPassConnectComponent(threshImg); 149 150 //不同連通區域用不同顏色表示 151 cv::Mat colorLabelImg=showColorLabel(labelImg); 152 153 //顯示 154 cv::imshow("thresh", threshImg); 155 cv::imshow("label", labelImg*20); 156 cv::imshow("colorLabel", colorLabelImg); 157 cv::waitKey(0); 158 }

相關推薦

two Pass方法連通檢測

1 #include "opencv2/imgproc/imgproc.hpp" 2 #include "opencv2/highgui/highgui.hpp" 3 #include <map> 4 #include <cassert> 5 #include &

Two-pass連通標記中的union-find結構

在Two-pass連通域標記中,第一次標記(first pass)時從左向右,從上向下掃描,會將各個有效畫素置一個label值,判斷規則如下(以4鄰域為例): 1)         當該畫素的左鄰畫素和上鄰畫素為無效值時,給該畫素置一個新的label值,label ++;

Two-Pass演算法——影象連通分析

在處理二值影象,提取感興趣目標時經常需要通過連通域的大小對候選目標進行初步篩選。OpenCV中findContour 方法可以返回輪廓並能夠計算輪廓面積。可其侷限性在對於非凸多邊形的面積計算是不準確的。 此時,利用連通域計算面積的方法更可靠,然而 findCon

【影象處理】利用種子填充法對二值影象進行連通標記-計算目標中心位置方法2

種子填充法原理 大致演算法如下: 設二值化影象A中,畫素值為255的點是前景,為0的點是背景。A(x, y)為座標(x, y)處的畫素值,遍歷影象的每個畫素: 1、 如果畫素值不等於255,則繼續訪問下一個元素。 2、 如果畫素值為A(x, y) = 255,則新建一

影象分析:二值影象連通標記-基於行程的標記方法

一、前言 二值影象,顧名思義就是影象的亮度值只有兩個狀態:黑(0)和白(255)。二值影象在影象分析與識別中有著舉足輕重的地位,因為其模式簡單,對畫素在空間上的關係有著極強的表現力。在實際應用中,很多影象的分析最終都轉換為二值影象的分析,比如:醫學影象分析、前景檢測、字

連通區域快速標記的two-pass演算法及其實現

1)         當該畫素的左鄰畫素和上鄰畫素為無效值時,給該畫素置一個新的label值,label ++; 2)         當該畫素的左鄰畫素或者上鄰畫素有一個為有效值時,將有效值畫素的label賦給該畫素的label值; 3)         當該畫素的左鄰畫素和上鄰畫素都為有效值時,選取其中

python 驗證碼 (二) 連通分割

pass 技術 def cep get() style box 垂直 -c 切割前:     切割後:          代碼: #-*-coding:utf-8-*- from PIL import Image import queue

實現基於C語言的二值圖像連通標記算法

ror mem main hair return pop incr one get 實現基於C語言的二值圖像連通域標記算法 1 #include <stdio.h> 2 #include <stdarg.h> 3 #include &l

實現基於C語言的二值影象連通標記演算法

實現基於C語言的二值影象連通域標記演算法 1 #include <stdio.h> 2 #include <stdarg.h> 3 #include <stddef.h> 4 #include <stdlib.h> 5 #includ

影象處理(五)——連通

連通區域(Connected Component)一般是指影象中具有相同畫素值且位置相鄰的前景畫素點組成的影象區域(Region,Blob)。連通區域分析(Connected Component Analysis,Connected Component Labeling)是指將影

542. 01 Matrix(Two pass,動態規劃)

Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The distance between two adjacent cells is 1. Example 1: Input: 0 0

瀏覽器同源政策及其規避方法,跨解決

瀏覽器安全的基石是”同源政策”(same-origin policy)。很多開發者都知道這一點,但瞭解得不全面。   本文詳細介紹”同源政策”的各個方面,以及如何規避它。   一、概述   1.1 含義   1995年,同

C# 連通及其質心標記

連通域在影象處理領域用的還是比較多的,在網上搜索連通域提取的演算法和程式碼,比較多的是用C++寫的,瀏覽次數比較多的是這篇部落格,但由於一直是用C#編寫程式碼,所以仿照那篇部落格中的C++程式,將其改為了C#程式,同時在此基礎上添加了質心計算和標記函式。 構造了兩個結構體,EqualRun用

影象分析:二值影象連通標記

一、前言 二值影象,顧名思義就是影象的亮度值只有兩個狀態:黑(0)和白(255)。二值影象在影象分析與識別中有著舉足輕重的地位,因為其模式簡單,對畫素在空間上的關係有著極強的表現力。在實際應用中,很多影象的分析最終都轉換為二值影象的分析,比如:醫學影象分析、前景檢測、字元識

JavaScript陣列方法及陣列檢測方法

方法總覽 concat 連線兩個或者更多陣列,並返回結果 var array = [1,3,4]; var array2 = [2, 4, 6]; array.concat(array2); //

樹專題---連通問題

樹專題—連通域問題 在acm競賽樹型問題中,經常會遇到與連通域相關問題。將樹拆成m個連通塊的方案數或者統計包含節點i的連通域的數目。在此,我們對此類問題進行總結。 型別一: 拆成m個互斥連通域

影象連通計算問題

通常,在二值圖中,我們通過連通域演算法,找到影象中各個獨立的封閉區間,甚至提取其輪廓特徵,為目標識別和追蹤提供了思路。而連通域演算法一般有4-連通域和8-連通域兩種定義。4-連通域指以檢測點為中心的上下左右4個方向為其可能連通域,8-連通域指以監測點為中心的上下左右,左上,右

基於OpenCV的findContours查詢影象連通,並進行排序

//基於OpenCV,對讀入圖片查詢連通域,並把每個連通域包含的座標點根據y值從小到大進行排序。 #include <opencv2/legacy/legacy.hpp> #include <opencv2/opencv.hpp> #include <

【OpenCV】8鄰種子填充法剔除短連通的高效演算法

//本文件參考種子填充演算法描述及C++程式碼實現(https://www.bbsmax.com/A/amd0AVWzge/)講解的原理,實現快速種子填充演算法,執行效果高。 //具體功能如下:依次掃描每個畫素,檢測8領域,尋找連通域,刪掉面積小於閾值的。 #define IMG_MARGIN

連通提取

基於區域生長的方法 單次掃描的演算法有一種基於區域生長的連通區域標記演算法,演算法流程如下: 輸入待標記影象bitmap,初始化一個與輸入影象同樣尺寸的標記矩陣labelmap,一個佇列queue以及標記計數labelIndex; 從左至右、從上至下的順序