File indexing completed on 2025-03-09 03:50:18

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-05-02
0007  * Description : sharpen image batch tool.
0008  *
0009  * SPDX-FileCopyrightText: 2009      by Matthias Welwarsky <matze at welwarsky dot de>
0010  * SPDX-FileCopyrightText: 2010-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "sharpen.h"
0017 
0018 // Qt includes
0019 
0020 #include <QLabel>
0021 #include <QWidget>
0022 
0023 // KDE includes
0024 
0025 #include <klocalizedstring.h>
0026 
0027 // Local includes
0028 
0029 #include "digikam_config.h"
0030 #include "dimg.h"
0031 #include "sharpenfilter.h"
0032 #include "unsharpmaskfilter.h"
0033 
0034 #ifdef HAVE_EIGEN3
0035 #   include "refocusfilter.h"
0036 #endif // HAVE_EIGEN3
0037 
0038 namespace DigikamBqmSharpenPlugin
0039 {
0040 
0041 Sharpen::Sharpen(QObject* const parent)
0042     : BatchTool(QLatin1String("Sharpen"), EnhanceTool, parent),
0043       m_settingsView(nullptr)
0044 {
0045 }
0046 
0047 Sharpen::~Sharpen()
0048 {
0049 }
0050 
0051 BatchTool* Sharpen::clone(QObject* const parent) const
0052 {
0053     return new Sharpen(parent);
0054 }
0055 
0056 void Sharpen::registerSettingsWidget()
0057 {
0058     m_settingsWidget = new QWidget;
0059     m_settingsView   = new SharpSettings(m_settingsWidget);
0060 
0061     connect(m_settingsView, SIGNAL(signalSettingsChanged()),
0062             this, SLOT(slotSettingsChanged()));
0063 
0064     BatchTool::registerSettingsWidget();
0065 }
0066 
0067 BatchToolSettings Sharpen::defaultSettings()
0068 {
0069     BatchToolSettings settings;
0070     SharpContainer defaultPrm = m_settingsView->defaultSettings();
0071 
0072     // sharpen method
0073 
0074     settings.insert(QLatin1String("SharpenFilterType"),    (int)defaultPrm.method);
0075 
0076     // simple sharp
0077 
0078     settings.insert(QLatin1String("SimpleSharpRadius"),    (int)defaultPrm.ssRadius);
0079 
0080     // unsharp mask
0081 
0082     settings.insert(QLatin1String("UnsharpMaskRadius"),    (double)defaultPrm.umRadius);
0083     settings.insert(QLatin1String("UnsharpMaskAmount"),    (double)defaultPrm.umAmount);
0084     settings.insert(QLatin1String("UnsharpMaskThreshold"), (double)defaultPrm.umThreshold);
0085     settings.insert(QLatin1String("UnsharpMaskLuma"),      (bool)defaultPrm.umLumaOnly);
0086 
0087 #ifdef HAVE_EIGEN3
0088 
0089     // refocus
0090 
0091     settings.insert(QLatin1String("RefocusRadius"),        (double)defaultPrm.rfRadius);
0092     settings.insert(QLatin1String("RefocusCorrelation"),   (double)defaultPrm.rfCorrelation);
0093     settings.insert(QLatin1String("RefocusNoise"),         (double)defaultPrm.rfNoise);
0094     settings.insert(QLatin1String("RefocusGauss"),         (double)defaultPrm.rfGauss);
0095     settings.insert(QLatin1String("RefocusMatrixSize"),    (int)defaultPrm.rfMatrix);
0096 
0097 #endif // HAVE_EIGEN3
0098 
0099     return settings;
0100 }
0101 
0102 void Sharpen::slotAssignSettings2Widget()
0103 {
0104     SharpContainer prm;
0105 
0106     // sharpen method
0107 
0108     prm.method        = settings()[QLatin1String("SharpenFilterType")].toInt();
0109 
0110     // simple sharp
0111 
0112     prm.ssRadius      = settings()[QLatin1String("SimpleSharpRadius")].toInt();
0113 
0114     // unsharp mask
0115 
0116     prm.umRadius      = settings()[QLatin1String("UnsharpMaskRadius")].toDouble();
0117     prm.umAmount      = settings()[QLatin1String("UnsharpMaskAmount")].toDouble();
0118     prm.umThreshold   = settings()[QLatin1String("UnsharpMaskThreshold")].toDouble();
0119     prm.umLumaOnly    = settings()[QLatin1String("UnsharpMaskLuma")].toBool();
0120 
0121 #ifdef HAVE_EIGEN3
0122 
0123     // refocus
0124 
0125     prm.rfRadius      = settings()[QLatin1String("RefocusRadius")].toDouble();
0126     prm.rfCorrelation = settings()[QLatin1String("RefocusCorrelation")].toDouble();
0127     prm.rfNoise       = settings()[QLatin1String("RefocusNoise")].toDouble();
0128     prm.rfGauss       = settings()[QLatin1String("RefocusGauss")].toDouble();
0129     prm.rfMatrix      = settings()[QLatin1String("RefocusMatrixSize")].toInt();
0130 
0131 #endif // HAVE_EIGEN3
0132 
0133     m_settingsView->setSettings(prm);
0134 }
0135 
0136 void Sharpen::slotSettingsChanged()
0137 {
0138     BatchToolSettings settings;
0139     SharpContainer prm = m_settingsView->settings();
0140 
0141     // sharpen method
0142 
0143     settings.insert(QLatin1String("SharpenFilterType"),    (int)prm.method);
0144 
0145     // simple sharp
0146 
0147     settings.insert(QLatin1String("SimpleSharpRadius"),    (int)prm.ssRadius);
0148 
0149     // unsharp mask
0150 
0151     settings.insert(QLatin1String("UnsharpMaskRadius"),    (double)prm.umRadius);
0152     settings.insert(QLatin1String("UnsharpMaskAmount"),    (double)prm.umAmount);
0153     settings.insert(QLatin1String("UnsharpMaskThreshold"), (double)prm.umThreshold);
0154     settings.insert(QLatin1String("UnsharpMaskLuma"),      (bool)prm.umLumaOnly);
0155 
0156 #ifdef HAVE_EIGEN3
0157 
0158     // refocus
0159 
0160     settings.insert(QLatin1String("RefocusRadius"),        (double)prm.rfRadius);
0161     settings.insert(QLatin1String("RefocusCorrelation"),   (double)prm.rfCorrelation);
0162     settings.insert(QLatin1String("RefocusNoise"),         (double)prm.rfNoise);
0163     settings.insert(QLatin1String("RefocusGauss"),         (double)prm.rfGauss);
0164     settings.insert(QLatin1String("RefocusMatrixSize"),    (int)prm.rfMatrix);
0165 
0166 #endif // HAVE_EIGEN3
0167 
0168     BatchTool::slotSettingsChanged(settings);
0169 }
0170 
0171 bool Sharpen::toolOperations()
0172 {
0173     if (!loadToDImg())
0174     {
0175         return false;
0176     }
0177 
0178     int filterType  = settings()[QLatin1String("SharpenFilterType")].toInt();
0179 
0180     switch (filterType)
0181     {
0182         case SharpContainer::SimpleSharp:
0183         {
0184             double radius = settings()[QLatin1String("SimpleSharpRadius")].toInt() / 10.0;
0185             double sigma;
0186 
0187             if (radius < 1.0)
0188             {
0189                 sigma = radius;
0190             }
0191             else
0192             {
0193                 sigma = sqrt(radius);
0194             }
0195 
0196             SharpenFilter filter(&image(), nullptr, radius, sigma);
0197             applyFilter(&filter);
0198             break;
0199         }
0200 
0201         case SharpContainer::UnsharpMask:
0202         {
0203             double r  = settings()[QLatin1String("UnsharpMaskRadius")].toDouble();
0204             double a  = settings()[QLatin1String("UnsharpMaskAmount")].toDouble();
0205             double th = settings()[QLatin1String("UnsharpMaskThreshold")].toDouble();
0206             bool    l = settings()[QLatin1String("UnsharpMaskLuma")].toBool();
0207 
0208             UnsharpMaskFilter filter(&image(), nullptr, r, a, th, l);
0209             applyFilter(&filter);
0210             break;
0211         }
0212 
0213         case SharpContainer::Refocus:
0214         {
0215 
0216 #ifdef HAVE_EIGEN3
0217 
0218             double radius      = settings()[QLatin1String("RefocusRadius")].toDouble();
0219             double correlation = settings()[QLatin1String("RefocusCorrelation")].toDouble();
0220             double noise       = settings()[QLatin1String("RefocusNoise")].toDouble();
0221             double gauss       = settings()[QLatin1String("RefocusGauss")].toDouble();
0222             int matrixSize     = settings()[QLatin1String("RefocusMatrixSize")].toInt();
0223 
0224             RefocusFilter filter(&image(), nullptr, matrixSize, radius, gauss, correlation, noise);
0225             applyFilter(&filter);
0226 
0227 #endif // HAVE_EIGEN3
0228 
0229             break;
0230         }
0231     }
0232 
0233     return savefromDImg();
0234 }
0235 
0236 } // namespace DigikamBqmSharpenPlugin
0237 
0238 #include "moc_sharpen.cpp"