摩尔纹
去摩尔纹(不知能否看出区别)
代码实现:
#include "opencv2/opencv.hpp"typedef cv::Mat Mat;Mat image_add_border( Mat &src ){
int w=2*src.cols; int h=2*src.rows; std::cout << "src: " << src.cols << "*" << src.rows << std::endl; cv::Mat padded; //扩充src的边缘,将图像变大,然后以各种外插方式自动填充图像边界,就可以处理边界的情况了 copyMakeBorder( src, padded, 0, h-src.rows, 0, w-src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0)); padded.convertTo(padded,CV_32FC1); std::cout << "opt: " << padded.cols << "*" << padded.rows << std::endl; return padded;}//transform to center 中心化void center_transform( cv::Mat &src ){
for(int i=0; i float *p = src.ptr<float>(i); for(int j=0; j p[j] = p[j] * pow(-1, i+j); } }}//对角线交换内容void zero_to_center(cv::Mat &freq_plane){
//这里为什么&上-2具体查看opencv文档 //其实是为了把行和列变成偶数 -2的二进制是11111111.......10 最后一位是0 int cx=freq_plane.cols/2; int cy=freq_plane.rows/2;//以下的操作是移动图像 (零频移到中心) cv::Mat part1_r(freq_plane, cv::Rect(0,0,cx,cy)); //元素坐标表示为(cx,cy) cv::Mat part2_r(freq_plane, cv::Rect(cx,0,cx,cy)); cv::Mat part3_r(freq_plane, cv::Rect(0,cy,cx,cy)); cv::Mat part4_r(freq_plane, cv::Rect(cx,cy,cx,cy)); cv::Mat tmp; part1_r.copyTo(tmp); //左上与右下交换位置(实部) part4_r.copyTo(part1_r); tmp.copyTo(part4_r); part2_r.copyTo(tmp); //右上与左下交换位置(实部) part3_r.copyTo(part2_r); tmp.copyTo(part3_r);}void show_spectrum( cv::Mat &complexI ){
cv::Mat tem