This forum has been archived. All content is frozen. Please use KDE Discuss instead.

Posterize Colourspace Segmentation

Tags: None
(comma "," separated)
User avatar
surt
Registered Member
Posts
20
Karma
0
OS

Posterize Colourspace Segmentation

Sat Jun 01, 2019 9:15 am
I'm an old fashioned pixel pusher so want to use the "sRGB built-in" colourspace for a traditional, naive colour intensity curve, however using posterize with "sRGB built-in" result in unequal segmentation.

I can get equal segmentation using the default colourspace, but then don't get the colour intensity curve I desire.

It appears to me as though the posterize is operating in a linearized colourspace, regardless of image colourspace.

Is there any way I can make it operate in my chosen colourspace?

Image
User avatar
halla
KDE Developer
Posts
5092
Karma
20
OS
Oh, that's actually kind of interesting... Posterize works in 16 bits sRGB, and was written before 16 bits sRGB used a linear TRC by default, so, yes, it works in linear space, unintentionally.
User avatar
halla
KDE Developer
Posts
5092
Karma
20
OS
User avatar
surt
Registered Member
Posts
20
Karma
0
OS
Cheers, that's working as I was wanting. :)
User avatar
surt
Registered Member
Posts
20
Karma
0
OS
Actually, I'm getting some serious slowdown with a posterize filter layer now. :'(

Speed is back to normal if I revert this commit.
User avatar
halla
KDE Developer
Posts
5092
Karma
20
OS
That's quite possible, because we're now not reusing the global color transformations, but recreate them especially for the posterize filter.
User avatar
surt
Registered Member
Posts
20
Karma
0
OS
I hackily moved the colour transformation creation out of the transform function into the constructor and filter layers are working at interactive speeds again.
User avatar
halla
KDE Developer
Posts
5092
Karma
20
OS
please share the patch? I might just be prepared to apply it :-)
User avatar
surt
Registered Member
Posts
20
Karma
0
OS
Never created a patch before so might be screwy.

Code: Select all
diff --git a/plugins/filters/posterize/posterize.cpp b/plugins/filters/posterize/posterize.cpp
index b9ecff442a..776371e996 100644
--- a/plugins/filters/posterize/posterize.cpp
+++ b/plugins/filters/posterize/posterize.cpp
@@ -68,6 +68,22 @@ KisPosterizeColorTransformation::KisPosterizeColorTransformation(int steps, cons
 {
     m_step = KoColorSpaceMathsTraits<quint16>::max / steps;
     m_halfStep = m_step / 2;
+    m_fromConversion = KoColorSpaceRegistry::instance()->createColorConverter(
+        m_colorSpace,
+        KoColorSpaceRegistry::instance()->rgb16("sRGB-elle-V2-srgbtrc.icc"),
+        KoColorConversionTransformation::internalRenderingIntent(),
+        KoColorConversionTransformation::internalConversionFlags());
+    m_toConversion = KoColorSpaceRegistry::instance()->createColorConverter(
+        KoColorSpaceRegistry::instance()->rgb16("sRGB-elle-V2-srgbtrc.icc"),
+        m_colorSpace,
+        KoColorConversionTransformation::internalRenderingIntent(),
+        KoColorConversionTransformation::internalConversionFlags());
+}
+
+KisPosterizeColorTransformation::~KisPosterizeColorTransformation()
+{
+    delete m_fromConversion;
+    delete m_toConversion;
 }
 
 KisConfigWidget* KisFilterPosterize::createConfigurationWidget(QWidget* parent, const KisPaintDeviceSP dev, bool) const
@@ -89,20 +105,9 @@ void KisPosterizeColorTransformation::transform(const quint8* src, quint8* dst,
 {
     quint16 m_rgba[4];
     quint16 m_mod[4];
-    KoColorConversionTransformation* t =
-            KoColorSpaceRegistry::instance()->createColorConverter(m_colorSpace,
-                                                                   KoColorSpaceRegistry::instance()->rgb16("sRGB-elle-V2-srgbtrc.icc"),
-                                                                   KoColorConversionTransformation::internalRenderingIntent(),
-                                                                   KoColorConversionTransformation::internalConversionFlags());
-    KoColorConversionTransformation* b =
-            KoColorSpaceRegistry::instance()->createColorConverter(
-                KoColorSpaceRegistry::instance()->rgb16("sRGB-elle-V2-srgbtrc.icc"),
-                m_colorSpace,
-                KoColorConversionTransformation::internalRenderingIntent(),
-                KoColorConversionTransformation::internalConversionFlags());
 
     while (nPixels--) {
-        t->transform(src, reinterpret_cast<quint8 *>(m_rgba), 1);
+        m_fromConversion->transform(src, reinterpret_cast<quint8 *>(m_rgba), 1);
 
         m_mod[0] = m_rgba[0] % m_step;
         m_mod[1] = m_rgba[1] % m_step;
@@ -114,7 +119,7 @@ void KisPosterizeColorTransformation::transform(const quint8* src, quint8* dst,
         m_rgba[2] = m_rgba[2] + (m_mod[2] > m_halfStep ? m_step - m_mod[2] : -m_mod[2]);
         m_rgba[3] = m_rgba[3] + (m_mod[3] > m_halfStep ? m_step - m_mod[3] : -m_mod[3]);
 
-        b->transform(reinterpret_cast<quint8 *>(m_rgba), dst, 1);
+        m_toConversion->transform(reinterpret_cast<quint8 *>(m_rgba), dst, 1);
         src += m_psize;
         dst += m_psize;
     }
diff --git a/plugins/filters/posterize/posterize.h b/plugins/filters/posterize/posterize.h
index 88f7b69922..2774a94d33 100644
--- a/plugins/filters/posterize/posterize.h
+++ b/plugins/filters/posterize/posterize.h
@@ -50,12 +50,15 @@ class KisPosterizeColorTransformation : public KoColorTransformation
 {
 public:
     KisPosterizeColorTransformation(int steps, const KoColorSpace* cs);
+    ~KisPosterizeColorTransformation() override;
     void transform(const quint8* src, quint8* dst, qint32 nPixels) const override;
 private:
     const KoColorSpace* m_colorSpace;
     quint32 m_psize;
     quint16 m_step;
     quint16 m_halfStep;
+    KoColorConversionTransformation* m_fromConversion;
+    KoColorConversionTransformation* m_toConversion;
 };
 
 #endif
User avatar
surt
Registered Member
Posts
20
Karma
0
OS
Added patch to phabricator here: https://phabricator.kde.org/D21529


Bookmarks



Who is online

Registered users: Baidu [Spider], Bing [Bot], Google [Bot]