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
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
//想法一:成功的
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()));
https://blog.csdn.net/yilizhihu/article/details/69388255
https://blog.csdn.net/weixin_43213208/article/details/84617183
没看懂,没解决掉
继续:从头到尾,一步步尝试,也没改什么,就ok了
c++有点难,加油
9、输出图像偏黑了,只有一点点边缘,是没归一化吗???
问题未解决
//normalize(tt, tt, 0, 1, CV_MINMAX);//图像全黑更看不见
normalize(tt, tt, 0, 255, CV_MINMAX);//显示如下图,也不是理想结果
10、opencv如何看图像的数据类型
不清楚数据是八位的还是16位的,如果是double类型的显示的时候输出格式可能稍微要变一下,像matlab里double类型的显示的时候就需要加中括号,不加就会二值化,怀疑这个是不是类似的问题
后发现似乎是加权滤波那块的问题,
filter2D(ssin, ssin1, ssin.depth(), kernel);并不是加权滤波
直接对原图滤波,如下图
正在思考如何编写加权滤波的函数,一是找到filter2D源码,除以13,改成需要的,上面的想法一可以实现加权滤波
4.23总结现有问题:
单纯地正余弦分解再合成,在matlab里面可以实现,在vs2017里面不能实现,如下图,感觉被二值化了
附上代码,求助大佬们解答,欢迎交流
//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