Documentation
¶
Overview ¶
Package ccl provides implementations of Connected Component Labeling algorithms.
Example ¶
package main
import (
"fmt"
)
func main() {
data := [][]int{
{0, 1, 0, 0, 0, 0, 0, 1, 1},
{1, 1, 1, 0, 1, 0, 0, 1, 0},
{0, 1, 0, 0, 1, 0, 0, 1, 0},
{0, 1, 1, 1, 1, 0, 0, 1, 0},
{0, 0, 0, 1, 0, 0, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 1},
{1, 1, 1, 0, 0, 0, 0, 1, 1},
{1, 0, 1, 0, 1, 0, 1, 1, 1},
}
bmp := newBitmap(data)
labelSizes := HoshenKopelman(bmp)
for y := 0; y < len(bmp.labels); y++ {
for x := 0; x < len(bmp.labels[y]); x++ {
fmt.Printf(" % d", bmp.labels[y][x])
}
fmt.Printf("\n")
}
fmt.Println("label sizes:", labelSizes)
}
type bitmap struct {
data [][]int
labels [][]int
x, y int
}
func newBitmap(data [][]int) *bitmap {
bmp := &bitmap{}
bmp.data = data
bmp.labels = make([][]int, len(data))
for y := 0; y < len(data); y++ {
bmp.labels[y] = make([]int, len(data[y]))
for x := range bmp.labels[y] {
bmp.labels[y][x] = NullLabel
}
}
return bmp
}
func (bmp *bitmap) Reset() {
bmp.x, bmp.y = 0, 0
}
func (bmp *bitmap) Next() bool {
if !bmp.next() {
return false
}
for bmp.data[bmp.y][bmp.x] == 0 {
if !bmp.next() {
return false
}
}
return true
}
func (bmp *bitmap) next() bool {
bmp.x++
if bmp.x >= len(bmp.data[bmp.y]) {
bmp.y++
bmp.x = 0
}
if bmp.y >= len(bmp.data) {
return false
}
return true
}
func (bmp *bitmap) Neighbors() []int {
x, y := bmp.x, bmp.y
neighbors := make([]int, 0)
if y > 0 && bmp.data[y-1][x] != 0 {
neighbors = append(neighbors, bmp.labels[y-1][x])
}
if x > 0 && bmp.data[y][x-1] != 0 {
neighbors = append(neighbors, bmp.labels[y][x-1])
}
return neighbors
}
func (bmp *bitmap) GetLabel() int {
return bmp.labels[bmp.y][bmp.x]
}
func (bmp *bitmap) SetLabel(label int) {
bmp.labels[bmp.y][bmp.x] = label
}
func (bmp *bitmap) Size() int {
return 1
}
Output: -1 0 -1 -1 -1 -1 -1 0 0 0 0 0 -1 0 -1 -1 0 -1 -1 0 -1 -1 0 -1 -1 0 -1 -1 0 0 0 0 -1 -1 0 -1 -1 -1 -1 0 -1 -1 -1 0 -1 -1 1 -1 0 0 0 0 0 -1 1 1 1 -1 -1 -1 -1 -1 2 1 -1 1 1 1 -1 -1 -1 2 1 1 1 -1 -1 -1 -1 2 2 1 -1 1 -1 3 -1 2 2 2 label sizes: [23 13 7 1]
Index ¶
Examples ¶
Constants ¶
const (
// EmptyBlob refers to points not belonging to an input image.
EmptyBlob = -1
)
const (
// NullLabel is the label that should be initially given to all nodes.
NullLabel = -1
)
Variables ¶
This section is empty.
Functions ¶
func BlobFromColor ¶
BlobFromColor returns a blob identifier from its color representation.
func ColorFromBlob ¶
ColorFromBlob returns the color representation of a blob.
func HoshenKopelman ¶
HoshenKopelman labels all nodes in the container using the Hoshen-Kopelman algorithm. It returns the sizes of all labels in descending order.
Types ¶
type Blob ¶
type Blob struct {
// ID is the identifier of this blob
ID int
// Size is the size of this blob.
Size int
}
Blob is a blob in connected components labeling
func CCLImage ¶
CCLImage performs connected components labeling on an image.NRGBA. The image is modified in-place, and the blob each pixel belongs to can be inferred from BlobFromColor.
func CollectBlobs ¶
CollectBlobs collects the blobs from an image returned by CCLImage.
type CCLabeler ¶
type CCLabeler interface {
// Reset resets the iterator of the container.
Reset()
// Next moves the iterator forward to the next node to be labeled.
// If there are no more nodes available, Next returns false.
Next() bool
// Neighbors returns the labels of the neighbors of the current node.
Neighbors() []int
// GetLabel returns the label of the current node.
GetLabel() int
// SetLabel sets the label of the current node.
SetLabel(int)
// Size returns the size of the current node.
// The sum of the sizes of all nodes sharing a same label is the size of that label.
// Labels are assigned in descending order of their sizes.
Size() int
}
A CCLabeler is a container of nodes that can be labeled.