fastNlMeansDenoising()官方具体实现代码
时间: 2024-01-20 11:04:29 浏览: 16
`cv2.fastNlMeansDenoising()`函数的官方具体实现代码如下:
```cpp
void cv::fastNlMeansDenoising(InputArray src, OutputArray dst, float h, int templateWindowSize, int searchWindowSize)
{
CV_INSTRUMENT_REGION()
CV_Assert(src.depth() == CV_8U || src.depth() == CV_16U || src.depth() == CV_32F);
CV_Assert(src.channels() == 1 || src.channels() == 3 || src.channels() == 4);
int type = src.type(), cn = src.channels();
Mat srcMat = src.getMat(), srcMatPad;
int top = (templateWindowSize - 1) / 2, left = (templateWindowSize - 1) / 2;
copyMakeBorder(srcMat, srcMatPad, top, top, left, left, cv::BORDER_DEFAULT);
if (type == CV_8UC1)
{
if (cn == 1)
fastNlMeansDenoising8u(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 3)
fastNlMeansDenoisingColored8u(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 4)
fastNlMeansDenoisingColored8u(srcMatPad, dst, h, templateWindowSize, searchWindowSize, true);
}
else if (type == CV_16UC1)
{
if (cn == 1)
fastNlMeansDenoising16u(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 3)
fastNlMeansDenoisingColored16u(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 4)
fastNlMeansDenoisingColored16u(srcMatPad, dst, h, templateWindowSize, searchWindowSize, true);
}
else if (type == CV_32FC1)
{
if (cn == 1)
fastNlMeansDenoising32f(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 3)
fastNlMeansDenoisingColored32f(srcMatPad, dst, h, templateWindowSize, searchWindowSize);
else if (cn == 4)
fastNlMeansDenoisingColored32f(srcMatPad, dst, h, templateWindowSize, searchWindowSize, true);
}
else
{
CV_Error(Error::StsUnsupportedFormat, "");
}
}
```
该函数主要包括以下几个步骤:
1. 对输入图像进行一些基本的检查,包括深度、通道数等方面的检查。
2. 对输入图像进行边界扩充,以便在边界处也能进行像素值的计算。
3. 根据输入图像的深度和通道数,调用相应的非局部均值去噪函数,进行去噪操作。
4. 如果输入图像的格式不受支持,则抛出异常。
具体的非局部均值去噪函数包括:
- `fastNlMeansDenoising8u()`:用于处理8位无符号单通道图像。
- `fastNlMeansDenoising16u()`:用于处理16位无符号单通道图像。
- `fastNlMeansDenoising32f()`:用于处理32位浮点型单通道图像。
- `fastNlMeansDenoisingColored8u()`:用于处理8位无符号三通道/四通道彩色图像。
- `fastNlMeansDenoisingColored16u()`:用于处理16位无符号三通道/四通道彩色图像。
- `fastNlMeansDenoisingColored32f()`:用于处理32位浮点型三通道/四通道彩色图像。
这些函数主要根据输入图像的深度和通道数,对像素值的计算进行相应的优化,以提高算法的效率和准确性。