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"