一维高斯平滑 c 语言,opencv实现轮廓高斯滤波平滑
时间: 2023-10-10 19:06:27 浏览: 175
一维高斯平滑可以使用以下代码实现:
```c
void GaussianSmooth_1D(float* data, int width, float sigma)
{
int half_kernel_size = ceil(3 * sigma);
int kernel_size = 2 * half_kernel_size + 1;
float* kernel = (float*)malloc(kernel_size * sizeof(float));
float sum = 0.0f;
// 计算高斯核
for (int i = 0; i < kernel_size; i++)
{
kernel[i] = exp(-(i - half_kernel_size) * (i - half_kernel_size) / (2 * sigma * sigma));
sum += kernel[i];
}
// 归一化高斯核
for (int i = 0; i < kernel_size; i++)
{
kernel[i] /= sum;
}
// 对每个点进行卷积
for (int i = half_kernel_size; i < width - half_kernel_size; i++)
{
float sum = 0.0f;
for (int j = -half_kernel_size; j <= half_kernel_size; j++)
{
sum += data[i + j] * kernel[j + half_kernel_size];
}
data[i] = sum;
}
free(kernel);
}
```
其中,`data` 是输入的一维数据,`width` 是数据的宽度,`sigma` 是高斯核的标准差。
对于 OpenCV 实现轮廓高斯滤波平滑,可以使用以下代码:
```c
void ContourGaussianSmooth(cv::Mat& img, float sigma)
{
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
// 二值化
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
// 提取轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 对每个轮廓进行高斯平滑
for (int i = 0; i < contours.size(); i++)
{
std::vector<cv::Point>& contour = contours[i];
// x 坐标进行高斯平滑
float* x_data = new float[contour.size()];
for (int j = 0; j < contour.size(); j++)
{
x_data[j] = contour[j].x;
}
GaussianSmooth_1D(x_data, contour.size(), sigma);
for (int j = 0; j < contour.size(); j++)
{
contour[j].x = (int)round(x_data[j]);
}
delete[] x_data;
// y 坐标进行高斯平滑
float* y_data = new float[contour.size()];
for (int j = 0; j < contour.size(); j++)
{
y_data[j] = contour[j].y;
}
GaussianSmooth_1D(y_data, contour.size(), sigma);
for (int j = 0; j < contour.size(); j++)
{
contour[j].y = (int)round(y_data[j]);
}
delete[] y_data;
}
// 绘制轮廓
cv::drawContours(img, contours, -1, cv::Scalar(0, 255, 0), 2);
}
```
其中,`img` 是输入的图像,`sigma` 是高斯核的标准差。这段代码先将输入图像转成灰度图像,并进行二值化,然后提取轮廓,对每个轮廓的 x 坐标和 y 坐标分别进行一维高斯平滑,最后将平滑后的轮廓绘制在原图上。
阅读全文