حذف فرکانس های بالا از تصویر - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

حذف فرکانس های بالا از تصویر

+1 امتیاز
سلام .چطور میشه تو حوزه فرکانس ، فرکانس های بالای تصویر را  حذف کنم .تو opencv نیاز دارم.
سوال شده دی 30, 1397  بوسیله ی عباس همت خواه (امتیاز 436)   2 8 13

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

یعنی عملا فرکانس های پایین را حفظ کرد البته اگر به صورت مکانی می خواستید این کار رو انجام بدید انواع فیلترهای پایین گذر از جمله gaussainBluer می تونست اینکارو انجام بده ولی تو حوزه فرکانس متفاوته در این روش ابتدا تصویر از حوزه مکانی  به حوزه فرکانس منتقل می کنید سپس عملیاتی که مد نظر دارید را روی تصویر مختلط انجام می دید (در این مثال شما فقط فرکانس هایی که در میانه تصویر قرار می گیرند باید حفظ بشن و بقیه را با صفر پر می کنید) و سپس با تبدیل معکوس تبدیل از حوزه فرکانس به حوزه مکانی تبدیل می کنیم.

 


void copyMakeBordeOptimalDFT(cv::InputArray _src, cv::InputOutputArray _dst) {
	cv::Mat src = _src.getMat();
	auto opt_size = getOptimalDFTMaxSize(_src.size());
	copyMakeBorder(_src, _dst, 0,opt_size.height - src.rows, 0, opt_size.width - src.cols, BORDER_CONSTANT, Scalar::all(0));
}

void computeDFT(Mat& image, Mat& dest)
{
                          
	Mat imgf;
	image.convertTo(imgf, CV_32F);
	dft(imgf, dest, DFT_COMPLEX_OUTPUT); 
}
void getOptimalGaussain(cv::InputArray _src, cv::InputOutputArray _dst,double sigma) {
	auto opt_size = getOptimalDFTMaxSize(_src.size());
	
	
	cv::Mat gauss_cof_1d_w = cv::getGaussianKernel(opt_size.width, sigma, CV_32F);
	cv::Mat gauss_cof_1d_h = cv::getGaussianKernel(opt_size.height, sigma, CV_32F);

	cv::Mat gauss_cof_2d = gauss_cof_1d_w * gauss_cof_1d_h.t();
	gauss_cof_2d.copyTo(_dst);
	
}
void fftshift(cv::Mat& image) {
	
	image = image(Rect(0, 0, image.cols & -2, image.rows & -2));

	
	int cx = image.cols / 2;
	int cy = image.rows / 2;

	Mat q0(image, Rect(0, 0, cx, cy));
	Mat q1(image, Rect(cx, 0, cx, cy));
	Mat q2(image, Rect(0, cy, cx, cy)); 
	Mat q3(image, Rect(cx, cy, cx, cy)); 

	Mat tmp;                           
	q0.copyTo(tmp);
	q3.copyTo(q0);
	tmp.copyTo(q3);

	q1.copyTo(tmp);                    
	q2.copyTo(q1);
	tmp.copyTo(q2);

}
void testFFT() {

		std::string filename = "image";

		Mat I = imread(filename, 0);
		if (I.empty())
			return ;
		Mat padded, complexI ,magI;

		copyMakeBordeOptimalDFT(I, padded);

		cv::Mat dft_mat,dft_mask;
		computeDFT(padded, dft_mat);

		cv::Mat mask;
		getOptimalGaussain(I, mask,08.5);
		computeDFT(mask, dft_mask);

		fftshift(mask);

		mulSpectrums(dft_mat, dft_mask, dft_mat, DFT_ROWS); 
		
		

		cv::Mat res;
		idft(dft_mat, res, DFT_REAL_OUTPUT + DFT_SCALE);
		fftshift(res);
		
							
	


}

 

پاسخ داده شده بهمن 2, 1397 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد تیر 4, 1399 بوسیله ی عباس مولایی
...