gpt4 book ai didi

c++ - 如何在 C++ 中实现拉普拉斯滤波器

转载 作者:太空宇宙 更新时间:2023-11-03 22:39:16 27 4
gpt4 key购买 nike

我实现了自己的拉普拉斯滤波器,但它看起来不像 Gimp 中的拉普拉斯滤波器。怎么了?

我的尝试 enter image description here

金普 enter image description here

cv::Mat ImageManipulation::mylaplace_filter(cv::Mat image){
int laplace_mask[9] = {0, -1, 0, -1, 4, -1, 0, -1, 0};
int tmp = 0;
int counter = 0;
cv::Mat laplaceImage = cv::Mat::ones(image.rows-2,image.cols-2,CV_8U);
for(int i = 1; i<image.rows-1; i++){
for(int j = 1; j<image.cols-1; j++){

for(int k = i-1; k<i+2; k++){
for(int l = j-1; l<j+2; l++){
tmp += laplace_mask[counter] * static_cast<int>(image.at<uchar>(k,l));
counter++;
}
}
std::cout << tmp/9 << std::endl;
laplaceImage.at<uchar>(i-1,j-1) = tmp/9;
tmp = 0;
counter = 0;
}
}
return laplaceImage;
}

最佳答案

在进入循环之前,您必须更改图像“laplaceImage”的类型,正如@Cris Luengo 评论的那样,不需要除以 9:

cv::Mat ImageManipulation::mylaplace_filter(cv::Mat image)
{
int laplace_mask[9] = { 0, -1, 0, -1, 4, -1, 0, -1, 0 };
int tmp = 0;
int counter = 0;
cv::Mat laplaceImage = cv::Mat::ones(image.rows - 2, image.cols - 2, CV_32F);

for (int i = 1; i < image.rows - 1; i++)
{
for (int j = 1; j < image.cols - 1; j++)
{

for (int k = i - 1; k < i + 2; k++)
{
for (int l = j - 1; l < j + 2; l++)
{
tmp += laplace_mask[counter] * static_cast<int>(image.at<uchar>(k, l));
counter++;
}
}
std::cout << tmp << std::endl;
laplaceImage.at<float>(i - 1, j - 1) = tmp;
tmp = 0;
counter = 0;
}
}
return laplaceImage;
}

之后如果你想显示“laplaceImage”或者保存在硬盘上,你可以在0到255之间调整它,然后把它转换成CV_8U。

关于c++ - 如何在 C++ 中实现拉普拉斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55763711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com