熱線電話:13121318867

登錄
首頁精彩閱讀圖像處理之基于圖的廣度優先搜索組件標記算法
圖像處理之基于圖的廣度優先搜索組件標記算法
2014-12-07
收藏

圖像處理之基于圖的廣度優先搜索組件標記算法


一:圖的遍歷與廣度優先搜索算法

圖的遍歷算法最常用是廣度優先搜索算法(BFS)與深度優先搜索算法(DFS),從一個的

節點開始,訪問相鄰的所有子節點,接著從這些子節點出發訪問下個相鄰子節點,如

此重復直到所有節點都被訪問。

20140329134814359


二:二值圖像組件標記實現流程

如果把圖像的每個像素點看成為圖的一個節點,則二值圖像中的每個連通區域都可以

看成一個無向圖,只要遍歷圖像中的每個像素點就可以找出每個連通區域,實現對二

值圖像連通區域組件的標記。大致步驟為:

1.      掃描圖像的每個像素點,獲得位置信息與圖像的灰度值強度(0~255)成為圖的節點

2.      對每個節點,初始化狀態與獲取它的上下左右四個鄰域節點

20140329134906984


1.      遍歷每個節點- BFS

2.      輸出結果與顯示

三:運行效果

20140329135014578


四:關鍵程序實現代碼

圖的搜索算法,節點狀態有三種,未訪問(Unvisit),已經訪問(Visited),已經標記(Marked)


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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.gloomyfish.image.watershed;
        
import java.util.HashMap;
import java.util.List;
import java.util.Map;
        
/**
 * Breath First Search for graphics
 * @author gloomyfish
 *
 */
public class BFSAlgorithm {
    private List<PixelPoint> pixelList = null;
    private int grayLevel = 1;
    public int getGrayLevel() {
        return grayLevel;
    }
            
    public int getTotalOfLabels()
    {
        Map<Integer, Integer> labelMap = new HashMap<Integer, Integer>();
        for(PixelPoint p : pixelList)
        {
            if(p.getValue() >= grayLevel)
            {
                if(labelMap.containsKey(p.getLabel()))
                {
                    Integer count = labelMap.get(p.getLabel());
                    count += 1;
                    labelMap.put(p.getLabel(), count);
                }
                else
                {
                    labelMap.put(p.getLabel(), new Integer(1));
                }
            }
        }
        Integer[] keys = labelMap.keySet().toArray(new Integer[0]);
        for(Integer key : keys)
        {
            System.out.println("Label index : " + key);
        }
        System.out.println("total labels : " + labelMap.size());
        return labelMap.size();
    }
        
    public void setGrayLevel(int grayLevel) {
        this.grayLevel = grayLevel;
    }
        
    public BFSAlgorithm(List<PixelPoint> pixelList)
    {
        this.pixelList = pixelList;
        grayLevel = 1; // front color - target pixel
    }
            
    public void process()
    {
        if(this.pixelList == null) return;
        int label = 1;
        for(PixelPoint pp : pixelList)
        {
            if(pp.getValue() >= grayLevel)
            {
                if(pp.getStatus() == PixelPoint.UNMARKED)
                {
                    pp.setStatus(PixelPoint.VISITED);
                    pp.setLabel(label);
                    MyQueue mq = new MyQueue(10000);
                    for(PixelPoint npp : pp.getNeighbours())
                    {
                        if(npp.getStatus() == PixelPoint.UNMARKED && npp.getValue() >= grayLevel)
                        {
                            npp.setStatus(PixelPoint.MARKED);
                            mq.enqueue(npp);
                        }
                    }
                    while(!mq.isEmpty())
                    {
                        PixelPoint obj = (PixelPoint)mq.dequeue();
                        if(obj.getStatus() == PixelPoint.MARKED)
                        {
                            obj.setLabel(label);
                            obj.setStatus(PixelPoint.VISITED);
                        }
                        for(PixelPoint nnpp : obj.getNeighbours())
                        {
                            if(nnpp.getStatus() == PixelPoint.UNMARKED && nnpp.getValue() >= grayLevel)
                            {
                                nnpp.setStatus(PixelPoint.MARKED);
                                mq.enqueue(nnpp);
                            }
                        }
                    }
                    label++;
                }
            }
        }
    }
        
}

圖像組件標記算法代碼:



1
2
3
4
5
6

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢