void SharpenFilter::sharpenImage(double radius, double sigma) { if (m_orgImage.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "No image data available!"; return; } if (radius <= 0.0) { m_destImage = m_orgImage; return; } double alpha, normalize = 0.0; long i = 0, u, v; int kernelWidth = getOptimalKernelWidth(radius, sigma); int halfKernelWidth = kernelWidth / 2; if ((int)m_orgImage.width() < kernelWidth) { qCWarning(DIGIKAM_DIMG_LOG) << "Image is smaller than radius!"; return; } QScopedArrayPointer<double> kernel(new double[kernelWidth * kernelWidth]); if (kernel.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "Unable to allocate memory!"; return; } for (v = -halfKernelWidth; v <= halfKernelWidth; ++v) { for (u = -halfKernelWidth; u <= halfKernelWidth; ++u) { alpha = exp(-((double) u * u + v * v) / (2.0 * sigma * sigma)); kernel[i] = alpha / (2.0 * M_PI * sigma * sigma); normalize += kernel[i]; ++i; } } kernel[i / 2] = (-2.0) * normalize; convolveImage(kernelWidth, kernel.data()); }
void CharcoalFilter::filterImage() { if (m_orgImage.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "No image data available!"; return; } if (d->pencil <= 0.0) { m_destImage = m_orgImage; return; } // -- Applying Edge effect ----------------------------------------------- register long i = 0; int kernelWidth = getOptimalKernelWidth(d->pencil, d->smooth); if ((int)m_orgImage.width() < kernelWidth) { qCWarning(DIGIKAM_DIMG_LOG) << "Image is smaller than radius!"; return; } QScopedArrayPointer<double> kernel(new double[kernelWidth * kernelWidth]); if (kernel.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "Unable to allocate memory!"; return; } for (i = 0 ; i < (kernelWidth * kernelWidth) ; ++i) { kernel[i] = (-1.0); } kernel[i / 2] = kernelWidth * kernelWidth - 1.0; convolveImage(kernelWidth, kernel.data()); // -- Applying Gaussian blur effect --------------------------------------- BlurFilter(this, m_destImage, m_destImage, 80, 85, (int)(d->smooth / 10.0)); if (!runningFlag()) { return; } // -- Applying stretch contrast color effect ------------------------------- StretchFilter stretch(&m_destImage, &m_destImage); stretch.startFilterDirectly(); m_destImage.putImageData(stretch.getTargetImage().bits()); postProgress(90); if (!runningFlag()) { return; } // -- Inverting image color ----------------------------------------------- InvertFilter invert(&m_destImage); invert.startFilterDirectly(); m_destImage.putImageData(invert.getTargetImage().bits()); postProgress(95); if (!runningFlag()) { return; } // -- Convert to neutral black & white ------------------------------------ MixerContainer settings; settings.bMonochrome = true; settings.blackRedGain = 0.3; settings.blackGreenGain = 0.59; settings.blackBlueGain = 0.11; MixerFilter mixer(&m_destImage, 0L, settings); mixer.startFilterDirectly(); m_destImage.putImageData(mixer.getTargetImage().bits()); postProgress(100); if (!runningFlag()) { return; } }