kolourpaint/patches/linear-sharpen-effect.diff

151 lines
4.4 KiB
Diff

Changes the "Sharpen" effect to Blitz::sharpen() instead of
Blitz::gaussianSharpen(), in order to avoid parameters that are currently
set in a dangerously adhoc fashion (radius, sigma, repeat).
Unfortunately, the results do not look good.
2007-08-14 20:35
Index: imagelib/effects/kpEffectBlurSharpen.cpp
===================================================================
--- imagelib/effects/kpEffectBlurSharpen.cpp (revision 699849)
+++ imagelib/effects/kpEffectBlurSharpen.cpp (working copy)
@@ -26,7 +26,7 @@
*/
-#define DEBUG_KP_EFFECT_BLUR_SHARPEN 0
+#define DEBUG_KP_EFFECT_BLUR_SHARPEN 1
#include <kpEffectBlurSharpen.h>
@@ -46,18 +46,10 @@
#endif
-static QImage BlurQImage (const QImage qimage_, int strength)
+static int RadiusForStrength (int strength)
{
- QImage qimage = qimage_;
- if (strength == 0)
- return qimage;
-
-
- // The numbers that follow were picked by experimentation to try to get
- // an effect linearly proportional to <strength> and at the same time,
- // be fast enough.
- //
- // I still have no idea what "radius" means.
+ // (must be in range and not 0)
+ Q_ASSERT (strength > 0 && strength <= kpEffectBlurSharpen::MaxStrength);
const double RadiusMin = 1;
const double RadiusMax = 10;
@@ -67,92 +59,36 @@ static QImage BlurQImage (const QImage q
(kpEffectBlurSharpen::MaxStrength - 1);
#if DEBUG_KP_EFFECT_BLUR_SHARPEN
- kDebug () << "kpEffectBlurSharpen.cpp:BlurQImage(strength=" << strength << ")"
+ kDebug () << "kpEffectBlurSharpen.cpp:RadiusForStrength(strength=" << strength << ")"
<< " radius=" << radius
<< endl;
#endif
-
- qimage = Blitz::blur (qimage, qRound (radius));
-
-
- return qimage;
+ return qRound (radius);
}
-static QImage SharpenQImage (const QImage &qimage_, int strength)
+
+static QImage BlurQImage (const QImage qimage_, int strength)
{
QImage qimage = qimage_;
if (strength == 0)
return qimage;
- // The numbers that follow were picked by experimentation to try to get
- // an effect linearly proportional to <strength> and at the same time,
- // be fast enough.
- //
- // I still have no idea what "radius" and "sigma" mean.
-
- const double RadiusMin = .1;
- const double RadiusMax = 2.5;
- const double radius = RadiusMin +
- (strength - 1) *
- (RadiusMax - RadiusMin) /
- (kpEffectBlurSharpen::MaxStrength - 1);
-
- const double SigmaMin = .5;
- const double SigmaMax = 3.0;
- const double sigma = SigmaMin +
- (strength - 1) *
- (SigmaMax - SigmaMin) /
- (kpEffectBlurSharpen::MaxStrength - 1);
-
- const double RepeatMin = 1;
- const double RepeatMax = 2;
- const double repeat = qRound (RepeatMin +
- (strength - 1) *
- (RepeatMax - RepeatMin) /
- (kpEffectBlurSharpen::MaxStrength - 1));
+ qimage = Blitz::blur (qimage, ::RadiusForStrength (strength));
-// I guess these values are more proper as they use an auto-calculated
-// radius but they cause sharpen() to be too slow.
-#if 0
- const double radius = 0/*auto-calculate*/;
-
- const double SigmaMin = .6;
- const double SigmaMax = 1.0;
- const double sigma = SigmaMin +
- (strength - 1) *
- (SigmaMax - SigmaMin) /
- (kpEffectBlurSharpen::MaxStrength - 1);
- const double RepeatMin = 1;
- const double RepeatMax = 3;
- const double repeat = qRound (RepeatMin +
- (strength - 1) *
- (RepeatMax - RepeatMin) /
- (kpEffectBlurSharpen::MaxStrength - 1));
-#endif
+ return qimage;
+}
-#if DEBUG_KP_EFFECT_BLUR_SHARPEN
- kDebug () << "kpEffectBlurSharpen.cpp:SharpenQImage(strength=" << strength << ")"
- << " radius=" << radius
- << " sigma=" << sigma
- << " repeat=" << repeat
- << endl;
-#endif
+static QImage SharpenQImage (const QImage &qimage_, int strength)
+{
+ QImage qimage = qimage_;
+ if (strength == 0)
+ return qimage;
- for (int i = 0; i < repeat; i++)
- {
- #if DEBUG_KP_EFFECT_BLUR_SHARPEN
- QTime timer; timer.start ();
- #endif
- qimage = Blitz::gaussianSharpen (qimage, radius, sigma);
- #if DEBUG_KP_EFFECT_BLUR_SHARPEN
- kDebug () << "\titeration #" + QString::number (i)
- << ": " + QString::number (timer.elapsed ()) << "ms" << endl;
- #endif
- }
+ qimage = Blitz::sharpen (qimage, ::RadiusForStrength (strength) * 10);
return qimage;