Page 1 of 1

Gaussian blur broken in my build

Posted: 2016-07-14T07:23:50-07:00
by neuron
While testing ImageMagick on Solaris 10, I found that gaussian blur is broken.

Sample taken from your site, enlarged a bit:

Code: Select all

convert -size 1700x1000 xc:black -fill white -draw 'circle    500,500  130,500' -draw 'circle   1200,500 1570,500' -draw 'rectangle 500,130 1200,870' -fill black -draw 'circle    500,500  250,500' -draw 'circle   1200,500 1450,500' -draw 'rectangle 500,250 1200,750' -fill white -draw 'circle    600,500  400,500' -draw 'circle   1100,500 1300,500' -draw 'rectangle 600,300 1100,700' -gaussian 10x10 +matte logo_mask.png
https://ibin.co/2o2Lhd3bf6PI.png

Interestingly if I do the same, just the output is *.gif, the image looks correct

https://ibin.co/2o2LqgQQQbhH.gif

Now before I start to blame IM, I would like to see the sources. And here's the question, where is the code doing gaussian blur for png (for un-indexed pallete I guess)? It smells as more math problems similar to what I had with comparing two double numbers exactly, without epsilon...

grep --include '*.c' -ri gaussian .

shows a lot of lines...

Thank you
__
Vlad

Re: Gaussian blur broken in my build

Posted: 2016-07-14T08:01:09-07:00
by neuron
Hmm, the function seems to be AcquireKernelBuiltIn in magick/morphology.c. And it seems to generate nice gaussian values. From 0.000585 at the corner to 0.001592 in the middle. They numbers are small, but they seem to fall the further one is from center. I don't have this problem latest Solaris box which uses different compiler, so I'll compare the results there. So maybe the problem is in application of the mask...

Re: Gaussian blur broken in my build

Posted: 2016-07-14T09:01:22-07:00
by snibgo
It might be helpful if you mentioned which version of IM you are using. Also if you gave a minimal command that showed the problem.

The documentation http://www.imagemagick.org/script/comma ... ssian-blur doesn't list "-gaussian" as a valid option. It should be "-gaussian-blur".

Re: Gaussian blur broken in my build

Posted: 2016-07-15T02:12:15-07:00
by neuron
Yes, that will be helpfull indeed :)

version 6.9.5-2

I have minimized the reproducible case to

broken:
convert -size 100x100 xc:black -fill white -draw 'circle 50,50 13,50' -gaussian 1x1 +matte png64:logo_mask.png
https://ibin.co/2o7sDXKWcyXA.png
ok:
convert -size 100x100 xc:black -fill white -draw 'circle 50,50 13,50' -gaussian 1x1 +matte png32:logo_mask.png
(or any other png than png64)
https://ibin.co/2o7sU5HKdyrT.png


At the moment I'm looking at ExportRGBAQuantum which seems to be the function where some sort of internal image type is converted to given bitness. And where the code takes different path for png64 and png32.

Thank you
__
Vlad

Re: Gaussian blur broken in my build

Posted: 2016-07-15T02:13:51-07:00
by neuron
Oh, and the -gaussian parameter is taken from here: http://www.imagemagick.org/Usage/advanced/#3d-logos

Re: Gaussian blur broken in my build

Posted: 2016-07-15T06:31:25-07:00
by snibgo
"-gaussian" currently works in v6. It doesn't in v7 magick, which needs "-gaussian-blur". "+matte" is also deprecated (but works in v6 and v7, for now).

Sorry, I can't reproduce the problem with IM v6.9.2-5, v6.9.3-7 or v7.0.1-4. Did you build IM yourself? If so, it may be an old libpng or something. "convert -list format" will have a line like:

Code: Select all

      PNG* PNG       rw-   Portable Network Graphics (libpng 1.6.17)

Re: Gaussian blur broken in my build

Posted: 2016-07-15T07:18:17-07:00
by neuron
Yes, I have built IM myself and because of the old environment I had to make few changes. That's why I asked where the blurring actually happens instead of blaming IM :) Anyway, at the moment I think that the compiler has some problem with compiling PopShortPixel (in magick/quantum-private.h). If I put printf in the routine (making the function non-leaf) blurring start to work again...

Thanks for looking into this
__
Vlad

Re: Gaussian blur broken in my build

Posted: 2016-07-15T08:15:12-07:00
by snibgo
I think gaussian blur always goes through effect.c function GaussianBlurImageChannel().

To eliminate a couple of possibilities, you might try a build with configure options "--disable-openmp --disable-opencl". Then, gaussian blur will use MorphologyImageChannel().

I think a developer should look at this.

Re: Gaussian blur broken in my build

Posted: 2016-07-18T03:54:03-07:00
by neuron
TL;DR Case solved, thanks everyone who helped.

It turns out to be a problem with old C compiler. At the end the problem was caused by miscompiled PopShortPixel. I tried to compile with more recent Studio compiler, but it failed on magick/deprecate.h (I guess it does not like to have 'export' with multiple functions on one line).

So this is problem on my side, not on ImageMagick side. Thanks again