我正在尝试像 Adobe Photoshop 中那样实现模糊遮罩。我在互联网上收集了很多信息,但我不确定我是否遗漏了一些东西。这是代码:
void unsharpMask( cv::Mat* img, double amount, double radius, double threshold ) {
// create blurred img
cv::Mat img32F, imgBlur32F, imgHighContrast32F, imgDiff32F, unsharpMas32F, colDelta32F, compRes, compRes32F, prod;
double r = 1.5;
img->convertTo( img32F, CV_32F );
cv::GaussianBlur( img32F, imgBlur32F, cv::Size(0,0), radius );
cv::subtract( img32F, imgBlur32F, unsharpMas32F );
// increase contrast( original, amount percent )
imgHighContrast32F = img32F * amount / 100.0f;
cv::subtract( imgHighContrast32F, img32F, imgDiff32F );
unsharpMas32F /= 255.0f;
cv::multiply( unsharpMas32F, imgDiff32F, colDelta32F );
cv::compare( cv::abs( colDelta32F ), threshold, compRes, cv::CMP_GT );
compRes.convertTo( compRes32F, CV_32F );
cv::multiply( compRes32F, colDelta32F, prod );
cv::add( img32F, prod, img32F );
img32F.convertTo( *img, CV_8U );
}
目前我正在使用灰度图像进行测试。如果我在 Photoshop 中尝试完全相同的参数,我会得到更好的结果。我自己的代码会产生嘈杂的图像。我究竟做错了什么。
第二个问题是,如何在 RGB 图像上应用锐化遮罩?我是否必须对 3 个通道中的每一个通道进行锐化,或者在其他色彩空间中会更好吗?这些事情在 Photoshop 中是如何完成的呢?
感谢您的帮助!