【opencv学习】相位滤波程序编写中遇到的许多小问题

一、基于正余弦分解的加权滤波

1、请问在C++中的“派”用怎么表示
#define pi 3.1415926
或const double pi=3.1415926
#include 没成功

2、opencv里面的正弦函数怎么表示
sin,对象得是像素点,对整个矩阵是不行的

3、opencv显示的图像一闪而过
waitkey(0)是一闪而过了,
改成waitkey( )还是一闪而过
用while(1)代替

4、【C/C++】代码换行问题
https://blog.csdn.net/sunriver2000/article/details/83931423

5、imread
【opencv学习】相位滤波程序编写中遇到的许多小问题_第1张图片

6、opencv中对图像像素点访问的三种方法利用程序进行解读
https://www.baidu.com/link?url=RL6zrFUT0f12llK5v85y1KDJIt_CJYdsLgZAokTKbMVnwAYZDEIcrl1-0oyt_siKiGAmiKIl59uZeS1KWYZPLAqZNJoLS8nzHUSMrdrfpvW&wd=&eqid=e9ac26340000c769000000055e9e9a7a

对像素值如何处理,实现加权滤波

//matlab写的代码
for e=1:6
for i=4:row-4
 for j=4:col-4
  s(i,j)=(2*s(i-1,j-1)+2*s(i-1,j)+2*s(i-1,j+1)+2*s(i,j-1)+s(i,j)+s(i,j+1)+s(i+1,j-1)+s(i+1,j)+s(i+1,j+1))/13;
  c(i,j)=(2*c(i-1,j-1)+2*c(i-1,j)+2*c(i-1,j+1)+2*c(i,j-1)+c(i,j)+c(i,j+1)+c(i+1,j-1)+c(i+1,j)+c(i+1,j+1))/13;
 end
end
end

【opencv学习】相位滤波程序编写中遇到的许多小问题_第2张图片

		//想法一:成功的
		for (int i = 1; i < (h-1); i++){
			for (int j = 1; j < (w-1); j++) {
				ssin.at<uchar>(i, j) = (2 * ssin.at<uchar>(i - 1, j - 1) + 2 * ssin.at<uchar>(i - 1, j)
					+ 2 * ssin.at<uchar>(i - 1, j + 1) + 2 * ssin.at<uchar>(i, j - 1) + ssin.at<uchar>(i, j) 
					+ ssin.at<uchar>(i, j + 1) + ssin.at<uchar>(i + 1, j - 1) + ssin.at<uchar>(i + 1, j) + ssin.at<uchar>(i + 1, j + 1)) / 13;
				ccos.at<uchar>(i, j) = (2 * ccos.at<uchar>(i - 1, j - 1) + 2 * ccos.at<uchar>(i - 1, j)
					+ 2 * ccos.at<uchar>(i - 1, j + 1) + 2 * ccos.at<uchar>(i, j - 1) + ccos.at<uchar>(i, j)
					+ ccos.at<uchar>(i, j + 1) + ccos.at<uchar>(i + 1, j - 1) + ccos.at<uchar>(i + 1, j) + ccos.at<uchar>(i + 1, j + 1)) / 13;
									
			}
		}
//想法二:失败
		for (int i = 1; i < (h-1); i++){
			const uchar* previous = ssin.ptr<uchar>(i - 1);
			const uchar* current = ssin.ptr<uchar>(i);
			const uchar* next = ssin.ptr<uchar>(i + 1);
			uchar* output = ssin.ptr<uchar>(i);
			for (int j = 1; j < (w-1); j++) {				
						output[j] = (2* previous[j-1] + 2 * previous[j]
						+ 2 * previous[j +1] + 2 * current[j - 1] +current[j]
						+current[j + 1] + next[j - 1] + next[j] + next[j+1]) / 13;
			}
		}

求高手指教,怎么修改可以实现

//想法三:利用filter2D,出现象了,但是不是加权滤波,失败	

		Mat kernel = (Mat_<char>(3, 3) << 2, 2, 2, 2, 1, 1,1, 1, 1);
		filter2D(ssin, ssin1, ssin.depth(), kernel);
		filter2D(ccos, ccos1, ccos.depth(), kernel);//加权滤波

7、opencv自定义滤波器
https://blog.csdn.net/PecoHe/article/details/94641963

8、错误:
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
【opencv学习】相位滤波程序编写中遇到的许多小问题_第3张图片
https://blog.csdn.net/yilizhihu/article/details/69388255
https://blog.csdn.net/weixin_43213208/article/details/84617183
没看懂,没解决掉
继续:从头到尾,一步步尝试,也没改什么,就ok了
c++有点难,加油

9、输出图像偏黑了,只有一点点边缘,是没归一化吗???
问题未解决
【opencv学习】相位滤波程序编写中遇到的许多小问题_第4张图片

//normalize(tt, tt, 0, 1, CV_MINMAX);//图像全黑更看不见
normalize(tt, tt, 0, 255, CV_MINMAX);//显示如下图,也不是理想结果

【opencv学习】相位滤波程序编写中遇到的许多小问题_第5张图片

10、opencv如何看图像的数据类型
不清楚数据是八位的还是16位的,如果是double类型的显示的时候输出格式可能稍微要变一下,像matlab里double类型的显示的时候就需要加中括号,不加就会二值化,怀疑这个是不是类似的问题

后发现似乎是加权滤波那块的问题,
filter2D(ssin, ssin1, ssin.depth(), kernel);并不是加权滤波
直接对原图滤波,如下图
【opencv学习】相位滤波程序编写中遇到的许多小问题_第6张图片
正在思考如何编写加权滤波的函数,一是找到filter2D源码,除以13,改成需要的,上面的想法一可以实现加权滤波

4.23总结现有问题:
单纯地正余弦分解再合成,在matlab里面可以实现,在vs2017里面不能实现,如下图,感觉被二值化了
【opencv学习】相位滤波程序编写中遇到的许多小问题_第7张图片
附上代码,求助大佬们解答,欢迎交流

//opencv基于正余弦分解的加权滤波
#include
#include

#define pi 3.1415926
using namespace std;
using namespace cv;
int main(int a, char**p)
{
	//Mat src = imread(p[1], CV_LOAD_IMAGE_GRAYSCALE);
	//这是在ubuntu上运行的,p[1]为控制台给出的参数,即图片路径
   //如果不知道怎么传入参数,可以直接改为

	Mat src1 = imread("weilvbo.png", CV_LOAD_IMAGE_GRAYSCALE);
	printf("src1.chan: %d\n", src1.channels());

	Mat src=src1.clone();
	//Mat src,src2;
	//cvtColor(src1, src2, CV_BGR2GRAY);//上面读取的时候已经是灰度图像了
	//threshold(src2, src, 96, 255, THRESH_BINARY);
	//printf("src2.chan: %d\n", src2.channels());
	printf("src.chan: %d\n", src.channels());
	//namedWindow("src", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	Mat ssin = Mat(src.size(), src.type());
	Mat ccos = src.clone();//尝试了几种克隆的方法
	Mat ccos1 = src.clone();
	Mat ssin1 = src.clone();
	Mat  nn;
	src.copyTo(nn);
	Mat mm=Mat::zeros(src.size(), src.type());
	Mat tt;
	src.copyTo(tt);
	//int w = getOptimalDFTSize(src.cols);
	//int h = getOptimalDFTSize(src.rows);
	int w = src.cols;
	int h = src.rows;
	printf("kuan(列数): %d\n", w);
	printf("gao(行数): %d\n", h);
	//imshow("m", mm);

	//imshow("n", nn);

	////imshow("t", tt);


	for (int i = 0; i <h ; i++)
	{
		for (int j = 0; j < w; j++) {
			int src2 = src.at<uchar>(i, j);
			//ssin.at(i, j) = 255 - src2;
			ssin.at<uchar>(i, j) = (sin(src.at<uchar>(i, j) * 2 * pi / 255) + 1) * 255 / 2;
			if (ssin.at<uchar>(i, j) > 255) {
				ssin.at<uchar>(i, j) = 255;
			}
			ccos.at<uchar>(i, j) = (cos(src.at<uchar>(i, j) * 2 * pi / 255) + 1) * 255 / 2;
			
			if (ccos.at<uchar>(i, j) > 255) {
				ccos.at<uchar>(i, j) = 255;
			}
		}
	}
	//imshow("ssin", ssin);
	//imshow("ccos", ccos);
	 
	
//加权滤波	有问题
		//Mat kernel = (Mat_(3, 3) << 2, 2, 2, 2, 1, 1,1, 1, 1);
		//filter2D(src, ssin1, ssin.depth(), kernel);
		//filter2D(ccos, ccos1, ccos.depth(), kernel);
//好似还有问题,特别模糊了,循环次数越多,越模糊:matlab也是这样
	//	for (int e = 0; e < 5; e++) {
	//		for (int i = 1; i < (h - 1); i++) {
	//			for (int j = 1; j < (w - 1); j++) {
	//				ssin.at(i, j) = (2 * ssin.at(i - 1, j - 1) + 2 * ssin.at(i - 1, j)
	//					+ 2 * ssin.at(i - 1, j + 1) + 2 * ssin.at(i, j - 1) + ssin.at(i, j)
	//					+ ssin.at(i, j + 1) + ssin.at(i + 1, j - 1) + ssin.at(i + 1, j) + ssin.at(i + 1, j + 1)) / 13;
	//				ccos.at(i, j) = (2 * ccos.at(i - 1, j - 1) + 2 * ccos.at(i - 1, j)
	//					+ 2 * ccos.at(i - 1, j + 1) + 2 * ccos.at(i, j - 1) + ccos.at(i, j)
	//					+ ccos.at(i, j + 1) + ccos.at(i + 1, j - 1) + ccos.at(i + 1, j) + ccos.at(i + 1, j + 1)) / 13;

	//			}
	//		}
	//	}


	//imshow("sin", ssin);
	//imshow("cos", ccos);
	
	//合成
		for (int i = 0; i < h; i++)
		{
			for (int j = 0; j < w; j++) 
			{
				mm.at<uchar>(i, j) = ssin.at<uchar>(i, j)-255/2;
				nn.at<uchar>(i, j) = ccos.at<uchar>(i, j) - 255/2;
				
				if (nn.at<uchar>(i, j) == 0)
				{
					tt.at<uchar>(i, j) = pi;
				}
				else
				{
					tt.at<uchar>(i, j) = atan(mm.at<uchar>(i, j) / nn.at<uchar>(i, j));

					if ((mm.at<uchar>(i, j) < 0) && (nn.at<uchar>(i, j) > 0)) {
						tt.at<uchar>(i, j) = tt.at<uchar>(i, j) + 2 * pi;
					}
					else if (nn.at<uchar>(i, j) < 0) {
						tt.at<uchar>(i, j) = tt.at<uchar>(i, j) + pi;
					}
				}
					tt.at<uchar>(i, j) = (tt.at<uchar>(i, j)*255/2)/pi;
					tt.at<uchar>(i, j) =abs( tt.at<uchar>(i, j));
					if (tt.at<uchar>(i, j) > 255){
					tt.at<uchar>(i, j) = 255;}
				
			}
		}
	Mat tt1;
	normalize(tt, tt1, 0, 255, CV_MINMAX);//归一化后全黑了几乎看bu'd,归255后只有黑白两色
	imshow("output", tt1);
	//////waitKey(5000);
	////
	waitKey(50000);
	return 0;
}

二、基于正余弦分解的低通滤波

在第三步合成的时候失败(上诉8的错误下移了一行),还得回到matlab里面重新理一下合成。
其中参考了https://blog.csdn.net/cyf15238622067/article/details/87919906

你可能感兴趣的:(图像处理学习进程)