From: cristy Date: Mon, 27 Oct 2014 00:29:16 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~1833 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f4f7c67a1eb6938e9ad6e68e447ebcb71d96072;p=imagemagick --- diff --git a/MagickCore/vision.c b/MagickCore/vision.c index b88f0ff70..81cfd2c38 100644 --- a/MagickCore/vision.c +++ b/MagickCore/vision.c @@ -156,6 +156,9 @@ static MagickBooleanType ConnectedComponentsStatistics(const Image *image, ssize_t y; + /* + Collect statistics on unique objects. + */ object=(CCObject *) AcquireQuantumMemory(number_objects,sizeof(*object)); if (object == (CCObject *) NULL) { @@ -235,6 +238,9 @@ static MagickBooleanType ConnectedComponentsStatistics(const Image *image, } component_view=DestroyCacheView(component_view); image_view=DestroyCacheView(image_view); + /* + Report statistics on unique objects. + */ qsort((void *) object,number_objects,sizeof(*object),CCObjectCompare); (void) fprintf(stdout, "Objects (id: bounding-box centroid area mean-color):\n"); @@ -247,7 +253,7 @@ static MagickBooleanType ConnectedComponentsStatistics(const Image *image, break; GetColorTuple(&object[i].color,MagickFalse,mean_color); (void) fprintf(stdout, - " %.20g: %.20gx%.20g%+.20g%+.20g %+.1f,%+.1f %.20g %s\n",(double) + " %.20g: %.20gx%.20g%+.20g%+.20g %.1f,%.1f %.20g %s\n",(double) object[i].id,(double) object[i].bounding_box.width,(double) object[i].bounding_box.height,(double) object[i].bounding_box.x, (double) object[i].bounding_box.y,object[i].centroid.x, @@ -257,12 +263,11 @@ static MagickBooleanType ConnectedComponentsStatistics(const Image *image, return(status); } -static MagickBooleanType MergeConnectedComponents(const Image *image, - const Image *component_image,const size_t number_objects, - const double area_threshold,ExceptionInfo *exception) +static MagickBooleanType MergeConnectedComponents(Image *image, + const size_t number_objects,const double area_threshold, + ExceptionInfo *exception) { CacheView - *component_view, *image_view; CCObject @@ -277,6 +282,9 @@ static MagickBooleanType MergeConnectedComponents(const Image *image, ssize_t y; + /* + Collect statistics on unique objects. + */ object=(CCObject *) AcquireQuantumMemory(number_objects,sizeof(*object)); if (object == (CCObject *) NULL) { @@ -288,18 +296,15 @@ static MagickBooleanType MergeConnectedComponents(const Image *image, for (i=0; i < (ssize_t) number_objects; i++) { object[i].id=i; - object[i].bounding_box.x=(ssize_t) component_image->columns; - object[i].bounding_box.y=(ssize_t) component_image->rows; - GetPixelInfo(image,&object[i].color); + object[i].bounding_box.x=(ssize_t) image->columns; + object[i].bounding_box.y=(ssize_t) image->rows; } status=MagickTrue; image_view=AcquireVirtualCacheView(image,exception); - component_view=AcquireVirtualCacheView(component_image,exception); for (y=0; y < (ssize_t) image->rows; y++) { register const Quantum - *restrict p, - *restrict q; + *restrict p; register ssize_t x; @@ -307,16 +312,14 @@ static MagickBooleanType MergeConnectedComponents(const Image *image, if (status == MagickFalse) continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); - q=GetCacheViewVirtualPixels(component_view,0,y,component_image->columns,1, - exception); - if ((p == (const Quantum *) NULL) || (q == (const Quantum *) NULL)) + if (p == (const Quantum *) NULL) { status=MagickFalse; continue; } for (x=0; x < (ssize_t) image->columns; x++) { - i=(ssize_t) *q; + i=(ssize_t) *p; if (x < object[i].bounding_box.x) object[i].bounding_box.x=x; if (x > (ssize_t) object[i].bounding_box.width) @@ -325,55 +328,21 @@ static MagickBooleanType MergeConnectedComponents(const Image *image, object[i].bounding_box.y=y; if (y > (ssize_t) object[i].bounding_box.height) object[i].bounding_box.height=(size_t) y; - object[i].color.red+=GetPixelRed(image,p); - object[i].color.green+=GetPixelGreen(image,p); - object[i].color.blue+=GetPixelBlue(image,p); - object[i].color.alpha+=GetPixelAlpha(image,p); - object[i].color.black+=GetPixelBlack(image,p); - object[i].centroid.x+=x; - object[i].centroid.y+=y; - object[i].area++; p+=GetPixelChannels(image); - q+=GetPixelChannels(component_image); } } for (i=0; i < (ssize_t) number_objects; i++) { object[i].bounding_box.width-=(object[i].bounding_box.x-1); object[i].bounding_box.height-=(object[i].bounding_box.y-1); - object[i].color.red=(MagickRealType) (object[i].color.red/ - object[i].area); - object[i].color.green=(MagickRealType) (object[i].color.green/ - object[i].area); - object[i].color.blue=(MagickRealType) (object[i].color.blue/ - object[i].area); - object[i].color.alpha=(MagickRealType) (object[i].color.alpha/ - object[i].area); - object[i].color.black=(MagickRealType) (object[i].color.black/ - object[i].area); - object[i].centroid.x=object[i].centroid.x/object[i].area; - object[i].centroid.y=object[i].centroid.y/object[i].area; } - component_view=DestroyCacheView(component_view); - image_view=DestroyCacheView(image_view); - qsort((void *) object,number_objects,sizeof(*object),CCObjectCompare); - (void) fprintf(stdout, - "Objects (id: bounding-box centroid area mean-color):\n"); + /* + Merge objects below area threshold. + */ for (i=0; i < (ssize_t) number_objects; i++) { - char - mean_color[MaxTextExtent]; - - if (status == MagickFalse) - break; - GetColorTuple(&object[i].color,MagickFalse,mean_color); - (void) fprintf(stdout, - " %.20g: %.20gx%.20g%+.20g%+.20g %+.1f,%+.1f %.20g %s\n",(double) - object[i].id,(double) object[i].bounding_box.width,(double) - object[i].bounding_box.height,(double) object[i].bounding_box.x, - (double) object[i].bounding_box.y,object[i].centroid.x, - object[i].centroid.y,(double) object[i].area,mean_color); } + image_view=DestroyCacheView(image_view); object=(CCObject *) RelinquishMagickMemory(object); return(status); } @@ -621,11 +590,12 @@ MagickExport Image *ConnectedComponentsImage(const Image *image, status=ConnectedComponentsStatistics(image,component_image,(size_t) n, exception); artifact=GetImageArtifact(image,"connected-components:area-threshold"); + area_threshold=0.0; if (artifact != (const char *) NULL) area_threshold=StringToDouble(artifact,(char **) NULL); if (area_threshold > 0.0) - status=MergeConnectedComponents(image,component_image,(size_t) n, - area_threshold,exception); + status=MergeConnectedComponents(component_image,(size_t) n,area_threshold, + exception); if (status == MagickFalse) component_image=DestroyImage(component_image); return(component_image); diff --git a/images/objects.gif b/images/objects.gif new file mode 100644 index 000000000..45835b629 Binary files /dev/null and b/images/objects.gif differ diff --git a/images/purse-blobs.png b/images/objects.png similarity index 100% rename from images/purse-blobs.png rename to images/objects.png diff --git a/images/purse.png b/images/purse.png deleted file mode 100644 index 7c0092f95..000000000 Binary files a/images/purse.png and /dev/null differ