Mat CVImageHelper::MeanFiltering(Mat dst)
{
Mat src;
blur(dst,src,cv::Size(10,10));
return src;
}
Mat CVImageHelper::GaussianFiltering(Mat dst)
{
Mat src;
GaussianBlur(dst,src,cv::Size(5,5),0);
return src;
}
Mat CVImageHelper::MedianFiltering(Mat dst)
{
Mat src;
medianBlur(dst, src, 5);
return src;
}
Mat CVImageHelper::BilateralFiltering(Mat dst)
{
Mat src;
bilateralFilter(dst, src, 5, 75, 75);
return src;
}
Mat CVImageHelper::LowpassFiltering(Mat dst)
{
Mat imgIn=dst.clone();
imgIn.convertTo(imgIn,CV_32F);
//DFT
Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
Mat DFT_image;
merge(planes,2,DFT_image);
dft(DFT_image,DFT_image);
//construct_H
Mat H(imgIn.size(),CV_32F,Scalar(1));
double D=0;
double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
for (int u=0;u<H.rows;u++) {
for (int v=0;v<H.cols;v++) {
D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
if(D>D0)
{
H.at<float>(u,v)=0;
}}}
//fftshift
int cx=H.cols/2;
int cy=H.rows/2;
Mat q1(H,Rect(0,0,cx,cy));
Mat q2(H,Rect(cx,0,cx,cy));
Mat q3(H,Rect(0,cy,cx,cy));
Mat q4(H,Rect(cx,cy,cx,cy));
Mat temp;
q1.copyTo(temp);
q4.copyTo(q1);
temp.copyTo(q4);
q2.copyTo(temp);
q3.copyTo(q2);
temp.copyTo(q3);
//filtering
Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
split(DFT_image,planes_dft);
Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
planes_out[0]=planesH[0].mul(planes_dft[0]);
planes_out[1]=planesH[1].mul(planes_dft[1]);
Mat complexIH;
merge(planes_out,2,complexIH);
//IDFT
Mat imgOut;
dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
normalize(imgOut,imgOut,0,1,NORM_MINMAX);
imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
return imgOut;
}
Mat CVImageHelper::HighpassFiltering(Mat dst)
{
Mat imgIn=dst.clone();
imgIn.convertTo(imgIn,CV_32F);
//DFT
Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
Mat DFT_image;
merge(planes,2,DFT_image);
dft(DFT_image,DFT_image);
//construct_H
Mat H(imgIn.size(),CV_32F,Scalar(1));
double D=0;
double D0= 0.05 * std::min(imgIn.rows, imgIn.cols);
for (int u=0;u<H.rows;u++) {
for (int v=0;v<H.cols;v++) {
D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
if(D<D0)
{
H.at<float>(u,v)=0;
}}}
//fftshift
int cx=H.cols/2;
int cy=H.rows/2;
Mat q1(H,Rect(0,0,cx,cy));
Mat q2(H,Rect(cx,0,cx,cy));
Mat q3(H,Rect(0,cy,cx,cy));
Mat q4(H,Rect(cx,cy,cx,cy));
Mat temp;
q1.copyTo(temp);
q4.copyTo(q1);
temp.copyTo(q4);
q2.copyTo(temp);
q3.copyTo(q2);
temp.copyTo(q3);
//filtering
Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
split(DFT_image,planes_dft);
Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
planes_out[0]=planesH[0].mul(planes_dft[0]);
planes_out[1]=planesH[1].mul(planes_dft[1]);
Mat complexIH;
merge(planes_out,2,complexIH);
//IDFT
Mat imgOut;
dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
normalize(imgOut,imgOut,0,1,NORM_MINMAX);
imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
return imgOut;
}
Mat CVImageHelper::BandpassFiltering(Mat dst)
{
Mat imgIn=dst.clone();
imgIn.convertTo(imgIn,CV_32F);
//DFT
Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
Mat DFT_image;
merge(planes,2,DFT_image);
dft(DFT_image,DFT_image);
//construct_H
Mat H(imgIn.size(),CV_32F,Scalar(1));
double D=0;
double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
double D1= 0.2 * std::min(imgIn.rows, imgIn.cols);
for (int u=0;u<H.rows;u++) {
for (int v=0;v<H.cols;v++) {
D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
if(D<=D0 || D>=D1)
{
H.at<float>(u,v)=0;
}}}
//fftshift
int cx=H.cols/2;
int cy=H.rows/2;
Mat q1(H,Rect(0,0,cx,cy));
Mat q2(H,Rect(cx,0,cx,cy));
Mat q3(H,Rect(0,cy,cx,cy));
Mat q4(H,Rect(cx,cy,cx,cy));
Mat temp;
q1.copyTo(temp);
q4.copyTo(q1);
temp.copyTo(q4);
q2.copyTo(temp);
q3.copyTo(q2);
temp.copyTo(q3);
//filtering
Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
split(DFT_image,planes_dft);
Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
planes_out[0]=planesH[0].mul(planes_dft[0]);
planes_out[1]=planesH[1].mul(planes_dft[1]);
Mat complexIH;
merge(planes_out,2,complexIH);
//IDFT
Mat imgOut;
dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
normalize(imgOut,imgOut,0,1,NORM_MINMAX);
imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
return imgOut;
}
Mat CVImageHelper::BandstopFiltering(Mat dst)
{
Mat imgIn=dst.clone();
imgIn.convertTo(imgIn,CV_32F);
//DFT
Mat planes[]={imgIn,Mat::zeros(imgIn.size(),CV_32F)};
Mat DFT_image;
merge(planes,2,DFT_image);
dft(DFT_image,DFT_image);
//construct_H
Mat H(imgIn.size(),CV_32F,Scalar(1));
double D=0;
double D0= 0.1 * std::min(imgIn.rows, imgIn.cols);
double D1= 0.2 * std::min(imgIn.rows, imgIn.cols);
for (int u=0;u<H.rows;u++) {
for (int v=0;v<H.cols;v++) {
D=sqrt((u-imgIn.rows/2)*(u-imgIn.rows/2)+(v-imgIn.cols/2)*(v-imgIn.cols/2));
if(D>D0 && D<D1)
{
H.at<float>(u,v)=0;
}}}
//fftshift
int cx=H.cols/2;
int cy=H.rows/2;
Mat q1(H,Rect(0,0,cx,cy));
Mat q2(H,Rect(cx,0,cx,cy));
Mat q3(H,Rect(0,cy,cx,cy));
Mat q4(H,Rect(cx,cy,cx,cy));
Mat temp;
q1.copyTo(temp);
q4.copyTo(q1);
temp.copyTo(q4);
q2.copyTo(temp);
q3.copyTo(q2);
temp.copyTo(q3);
//filtering
Mat planesH[]={Mat_<float>(H.clone()),Mat_<float>(H.clone())};
Mat planes_dft[]={DFT_image,Mat::zeros(DFT_image.size(),CV_32F)};
split(DFT_image,planes_dft);
Mat planes_out[]={Mat::zeros(DFT_image.size(),CV_32F),Mat::zeros(DFT_image.size(),CV_32F)};
planes_out[0]=planesH[0].mul(planes_dft[0]);
planes_out[1]=planesH[1].mul(planes_dft[1]);
Mat complexIH;
merge(planes_out,2,complexIH);
//IDFT
Mat imgOut;
dft(complexIH,imgOut,DFT_INVERSE|DFT_REAL_OUTPUT);
normalize(imgOut,imgOut,0,1,NORM_MINMAX);
imgOut.convertTo(imgOut, CV_8U, 255, 0); // 将planesH[0]的值扩大255倍,并转换为8位无符号整型
return imgOut;
}
opencv&C++: 均值滤波、中值滤波、高斯滤波、双边滤波、频域低通滤波、频域高通滤波、频域带通滤波、频率带阻滤波代码
最新推荐文章于 2024-05-21 19:09:04 发布