C++ 如何在C++;
我实现了自己的拉普拉斯过滤器,但它看起来不像Gimp中的拉普拉斯过滤器。怎么了 我的尝试 笨蛋C++ 如何在C++;,c++,opencv,image-processing,C++,Opencv,Image Processing,我实现了自己的拉普拉斯过滤器,但它看起来不像Gimp中的拉普拉斯过滤器。怎么了 我的尝试 笨蛋 cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image){ int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0}; int-tmp=0; int计数器=0; cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_8U); 对于(int i=1
cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image){
int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0};
int-tmp=0;
int计数器=0;
cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_8U);
对于(int i=1;i在进入循环之前,您必须更改图像“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;
}
cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image)
{
int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0};
int-tmp=0;
int计数器=0;
cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_32F);
对于(int i=1;i 这是一段非常简单的代码,有助于理解基础知识
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
using namespace cv;
int main(int argc, char** argv){
Mat src_gray, dst;
Mat src = imread("ball.jpg");
int kernel = 3;
Mat filter = (Mat_ <double>(3,3) << 1,1,1,1,-8,1,1,1,1); // Laplace Filter
filter2D(src, dst, -1, filter);
imshow("Simple Function", dst);
imshow("Simple Source", src);
waitKey(0);
return 0;
}
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
使用名称空间cv;
int main(int argc,字符**argv){
材料src_gray,dst;
Mat src=imread(“ball.jpg”);
int核=3;
Mat过滤器=(Mat_u3,3)我不知道Gimp在那里做什么,但对于拉普拉斯滤波器来说,这也不是一个正确的输出。负值很重要,你不能通过饱和到零来丢弃它们。你需要创建一个有符号的输出图像,并存储有符号的结果。此外,你的1/9标准化很奇怪。你从哪里得到的?标准化的原因是什么按9缩放?以前从未见过。对不起,我的错误我是从平均值过滤器中获取的,我以前实现过。无需缩放图像以进行显示。int32
图像的值可能在[-255*8,255*8]范围内。您可以执行laplaceImage/16+128
以正确显示它。或者在图像中查找实际的最小值和最大值。但这是一个显示问题,不应将其混入过滤图像的计算中。您需要添加@Cris
以在重播我的评论时通知我,否则我只能看到您的评论(注:)
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
using namespace cv;
int main(int argc, char** argv){
Mat src_gray, dst;
Mat src = imread("ball.jpg");
int kernel = 3;
Mat filter = (Mat_ <double>(3,3) << 1,1,1,1,-8,1,1,1,1); // Laplace Filter
filter2D(src, dst, -1, filter);
imshow("Simple Function", dst);
imshow("Simple Source", src);
waitKey(0);
return 0;
}