2D convolution: simple texture segmentation (example #2)

Load two texture images

tmp1 = ReadImage["texture1.gif"] ; tmp2 = ReadImage["texture4.gif"] ; img = BlockMatrix[{{tmp1, tmp2}}] ; scale = 1 ;

Display combined texture image

ShowImage[img, scale] ;

[Graphics:../HTMLFiles/index_45.gif]

Compute nine texture energy images

"Edge-Level" texture energy image (1)

tmp = Mask[img, EL[] // N] ; tex1 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex1, scale, Max[tex1]] ;

[Graphics:../HTMLFiles/index_47.gif]

"Ridge-Level" texture energy image (2)

tmp = Mask[img, RL[] // N] ; tex2 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex2, scale, Max[tex2]] ;

[Graphics:../HTMLFiles/index_49.gif]

"Edge-Spot" texture energy image (3)

tmp = Mask[img, ES[] // N] ; tex3 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex3, scale, Max[tex3]] ;

[Graphics:../HTMLFiles/index_51.gif]

"Ridge-Ridge" texture energy image (4)

tmp = Mask[img, RR[] // N] ; tex4 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex4, scale, Max[tex4]] ;

[Graphics:../HTMLFiles/index_53.gif]

"Spot-Level" texture energy image (5)

tmp = Mask[img, SL[] // N] ; tex5 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex5, scale, Max[tex5]] ;

[Graphics:../HTMLFiles/index_55.gif]

"Edge-Edge" texture energy image (6)

tmp = Mask[img, EE[] // N] ; tex6 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex6, scale, Max[tex6]] ;

[Graphics:../HTMLFiles/index_57.gif]

"Edge-Ridge" texture energy image (7)

tmp = Mask[img, ER[] // N] ; tex7 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex7, scale, Max[tex7]] ;

[Graphics:../HTMLFiles/index_59.gif]

"Spot-Spot" texture energy image (8)

tmp = Mask[img, SS[] // N] ; tex8 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex8, scale, Max[tex8]] ;

[Graphics:../HTMLFiles/index_61.gif]

"Spot-Ridge" texture energy image (9)

tmp = Mask[img, SR[] // N] ; tex9 = Mask[tmp, MeanFilter[15] // N] ; ShowImage[tex9, scale, Max[tex9]] ;

[Graphics:../HTMLFiles/index_63.gif]

Cluster nine-dimensional texture data

Generate 9d texture data

texdat = Partition[Flatten[Transpose /@ ({tex1, tex2, tex3, tex4, tex5, tex6, tex7, tex8, tex9} // Transpose)], 9] // N ;

Perform 2-cluster k-means algorithm

This step may take a while...

Timing[centroids = KMeansAll[texdat, 2, .001] ;]

RowBox[{{, RowBox[{RowBox[{18.7,  , Second}], ,, Null}], }}]

Assign class labels

This step may take a while...

Timing[classes = AssignClass[#, centroids] & /@ texdat ;]

RowBox[{{, RowBox[{RowBox[{17.54,  , Second}], ,, Null}], }}]

Display segmentation results

segmented = Partition[classes, Dimensions[img] // Last] ; ShowImage[segmented, scale, Length[centroids] + 1] ;

[Graphics:../HTMLFiles/index_70.gif]

Compare to intensity-based clustering

Generate 1d intensity data

intdat = {#} &/@ Flatten[img] // N ;

Perform 2-cluster k-means algorithm

This step may take a while...

Timing[c2 = KMeansAll[intdat, 2, .001] ;]

RowBox[{{, RowBox[{RowBox[{16.94,  , Second}], ,, Null}], }}]

Assign class labels

This step may take a while...

Timing[classes = AssignClass[#, c2] & /@ intdat ;]

RowBox[{{, RowBox[{RowBox[{16.26,  , Second}], ,, Null}], }}]

Display segmentation results

segmented = Partition[classes, Dimensions[img] // Last] ; ShowImage[segmented, scale, Length[c2] + 1] ;

[Graphics:../HTMLFiles/index_77.gif]


Created by Mathematica  (February 5, 2004)