Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C++;和opencv 我尝试用C++和OpenCV实现图像缩放的样条CabMull ROM。 我执行了两个测试,第一个是图像缩放(X2),第二个是图像重建(缩放图像抽取)。 我的问题是,在插值的图像中会出现一些黑白像素(),当我显示像素值时,我发现白色像素的值为负值,黑色像素的值大于255,并且重建的图像会变得模糊(和) float CalCurveInt(浮点t、浮点p0、浮点p1、浮点p2、浮点p3) { 浮点数t2=t*t; 浮点数t3=t2*t; 浮动x=0.5f*((2.0f*p1)+ (-p0+p2)*t+ (2.0f*p0-5.0f*p1+4*p2-p3)*t2+ (-p0+3.0f*p1-3.0f*p2+p3)*t3); 返回x; } Mat CalcCatmull(Mat&src,int缩放) { intv1,v2,v3,v4,Ptr,Xmax,Ymax; 浮动结果t、c1、c2、c3、c4; //------------------------------------------------------------ Xmax=src.cols; Ymax=src.rows; 大小srcSize(缩放*Xmax,Ymax); 材料dst(SRC尺寸,CV8UC1); 对于(int j=0;j_C++_Image_Opencv_Zooming_Catmull Rom Curve - Fatal编程技术网

使用C++;和opencv 我尝试用C++和OpenCV实现图像缩放的样条CabMull ROM。 我执行了两个测试,第一个是图像缩放(X2),第二个是图像重建(缩放图像抽取)。 我的问题是,在插值的图像中会出现一些黑白像素(),当我显示像素值时,我发现白色像素的值为负值,黑色像素的值大于255,并且重建的图像会变得模糊(和) float CalCurveInt(浮点t、浮点p0、浮点p1、浮点p2、浮点p3) { 浮点数t2=t*t; 浮点数t3=t2*t; 浮动x=0.5f*((2.0f*p1)+ (-p0+p2)*t+ (2.0f*p0-5.0f*p1+4*p2-p3)*t2+ (-p0+3.0f*p1-3.0f*p2+p3)*t3); 返回x; } Mat CalcCatmull(Mat&src,int缩放) { intv1,v2,v3,v4,Ptr,Xmax,Ymax; 浮动结果t、c1、c2、c3、c4; //------------------------------------------------------------ Xmax=src.cols; Ymax=src.rows; 大小srcSize(缩放*Xmax,Ymax); 材料dst(SRC尺寸,CV8UC1); 对于(int j=0;j

使用C++;和opencv 我尝试用C++和OpenCV实现图像缩放的样条CabMull ROM。 我执行了两个测试,第一个是图像缩放(X2),第二个是图像重建(缩放图像抽取)。 我的问题是,在插值的图像中会出现一些黑白像素(),当我显示像素值时,我发现白色像素的值为负值,黑色像素的值大于255,并且重建的图像会变得模糊(和) float CalCurveInt(浮点t、浮点p0、浮点p1、浮点p2、浮点p3) { 浮点数t2=t*t; 浮点数t3=t2*t; 浮动x=0.5f*((2.0f*p1)+ (-p0+p2)*t+ (2.0f*p0-5.0f*p1+4*p2-p3)*t2+ (-p0+3.0f*p1-3.0f*p2+p3)*t3); 返回x; } Mat CalcCatmull(Mat&src,int缩放) { intv1,v2,v3,v4,Ptr,Xmax,Ymax; 浮动结果t、c1、c2、c3、c4; //------------------------------------------------------------ Xmax=src.cols; Ymax=src.rows; 大小srcSize(缩放*Xmax,Ymax); 材料dst(SRC尺寸,CV8UC1); 对于(int j=0;j,c++,image,opencv,zooming,catmull-rom-curve,C++,Image,Opencv,Zooming,Catmull Rom Curve,我以前的实现,它似乎工作得很好 #include <iostream> #include <vector> #include <stdio.h> #include <stdarg.h> #include "opencv2/opencv.hpp" #include "fstream" #include "iostream" using namespace std; using namespa

我以前的实现,它似乎工作得很好

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/opencv.hpp"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;

//-----------------------------------------------------------------------------------------------------
// Take 2 points, compute values between p1 and p2, p0 and p3 need for tangents computation
// on the bouunds. Parameter t - changes in range 0 to 1 (0 - we are in p1, 1 - we are in p2)
//-----------------------------------------------------------------------------------------------------
void PointOnCurve(Point2f &out, float t, Point2f p0, Point2f p1, Point2f p2, Point2f p3)
{
    float t2 = t * t;
    float t3 = t2 * t;
    out.x = 0.5f * ( ( 2.0f * p1.x ) + ( -p0.x + p2.x ) * t +
        ( 2.0f * p0.x - 5.0f * p1.x + 4 * p2.x - p3.x ) * t2 +
        ( -p0.x + 3.0f * p1.x - 3.0f * p2.x + p3.x ) * t3 );
    out.y = 0.5f * ( ( 2.0f * p1.y ) +  ( -p0.y + p2.y ) * t +
        ( 2.0f * p0.y - 5.0f * p1.y + 4 * p2.y - p3.y ) * t2 +
        ( -p0.y + 3.0f * p1.y - 3.0f * p2.y + p3.y ) * t3 );
}
//-----------------------------------------------------------------------------------------------------
// interpolation of 4х4 patch
// 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//  
//          S- pixels of source imgage
//
//          sequentially take 2 middle columns and computte D.
//
//          S * 1 * 2 * S
//          * * * * * * *
//          S * 1 * 2 * S
//          * * D * D * *
//          S * 1 * 2 * S
//          * * * * * * *
//          S * 1 * 2 * S
//
//          same for rows and we will have F
//
//          S * S * S * S
//          * * * * * * *
//          3 * 3 F 3 * 3
//          * * D * D * *
//          4 * 4 F 4 * 4
//          * * * * * * *
//          S * S * S * S
//
//          then compute diagonals and after averafing with neihbours will find С
//
//          1 * S * S * 2
//          * * * * * * *
//          S * 1 F 2 * S
//          * * D C D * *
//          S * 2 F 1 * S
//          * * * * * * *
//          2 * S * S * 1
//-----------------------------------------------------------------------------------------------------
void PointOnSurface(Mat& src,Mat& dst)
{
float t=0.5;
Point2f out;
dst=Mat(3,3,CV_32FC1);
// Угловые точки результата совпадают с точками центральной ячейки исходного патча
dst.at<float>(0,0)=src.at<float>(1,1);
dst.at<float>(2,0)=src.at<float>(2,1);

dst.at<float>(0,2)=src.at<float>(1,2);
dst.at<float>(2,2)=src.at<float>(2,2);

Point2f p0;
Point2f p1;
Point2f p2;
Point2f p3;

p0.x=0;p0.y=src.at<float>(0,1);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(2,1);
p3.x=3;p3.y=src.at<float>(3,1);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(1,0)=out.y;

p0.x=0;p0.y=src.at<float>(0,2);
p1.x=1;p1.y=src.at<float>(1,2);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(3,2);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(1,2)=out.y;

p0.x=0;p0.y=src.at<float>(1,0);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(1,2);
p3.x=3;p3.y=src.at<float>(1,3);


PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(0,1)=out.y;

p0.x=0;p0.y=src.at<float>(2,0);
p1.x=1;p1.y=src.at<float>(2,1);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(2,3);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(2,1)=out.y;

// diagonals

// 1
p0.x=0;p0.y=src.at<float>(0,0);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(3,3);


PointOnCurve(out,t,p0,p1,p2,p3);
float d1=out.y;

// 2
p0.x=0;p0.y=src.at<float>(3,0);
p1.x=1;p1.y=src.at<float>(2,1);
p2.x=2;p2.y=src.at<float>(1,2);
p3.x=3;p3.y=src.at<float>(0,3);

PointOnCurve(out,t,p0,p1,p2,p3);
float d2=out.y;

// averaging
dst.at<float>(1,1)=1.0/6.0*(d1+d2+dst.at<float>(0,1)+dst.at<float>(1,0)+dst.at<float>(1,2)+dst.at<float>(2,1));
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
void Scale2Times(Mat& src_img,Mat &dstImg)
{
    Mat imgf,img;
    Mat dst;
    Mat src;
    src_img.convertTo(imgf,CV_32FC1,1.0/255.0);

    cv::copyMakeBorder(imgf,img,1,1,1,1,cv::BORDER_REFLECT);

    dstImg=Mat(src_img.rows*2,src_img.cols*2,CV_32FC1);

    for(int i=0;i<img.rows-4;i++)
    {
        for(int j=0;j<img.cols-4;j++)
        {
            img(Rect(j,i,4,4)).copyTo(src);
            PointOnSurface(src,dst);
            dst.copyTo(dstImg(Rect(2*j+1,2*i+1,3,3)));
        }
    }
    dstImg=dstImg(Rect(0,0,dstImg.cols-2,dstImg.rows-2)).clone();
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
    namedWindow("Src");
    namedWindow("cvResize");
    namedWindow("Catmul-Rom");
    Mat Img=imread("C:\\ImagesForTest\\1.tiff",0);
    imshow("Src",Img);
    Mat dstImg;
    Scale2Times(Img,dstImg);
    imshow("Catmul-Rom",dstImg);

    Mat ImgLin(Img.rows*2,Img.cols*2,CV_8UC1);
    cv::resize(Img,ImgLin,Size(Img.cols*2,Img.rows*2),INTER_CUBIC);
    imshow("cvResize",ImgLin);

    waitKey(0);
    //getchar();

    return 0;
}
#包括
#包括
#包括
#包括
#包括“opencv2/opencv.hpp”
#包括“fstream”
#包括“iostream”
使用名称空间std;
使用名称空间cv;
//-----------------------------------------------------------------------------------------------------
//取2个点,计算p1和p2之间的值,p0和p3需要计算切线
//在Bounds上。参数t-范围0到1的变化(0-我们在p1,1-我们在p2)
//-----------------------------------------------------------------------------------------------------
无效点曲线(点2F&out、浮点t、点2F p0、点2F p1、点2F p2、点2F p3)
{
浮点数t2=t*t;
浮点数t3=t2*t;
out.x=0.5f*((2.0f*p1.x)+(-p0.x+p2.x)*t+
(2.0f*p0.x-5.0f*p1.x+4*p2.x-p3.x)*t2+
(-p0.x+3.0f*p1.x-3.0f*p2.x+p3.x)*t3);
out.y=0.5f*((2.0f*p1.y)+(-p0.y+p2.y)*t+
(2.0f*p0.y-5.0f*p1.y+4*p2.y-p3.y)*t2+
(-p0.y+3.0f*p1.y-3.0f*p2.y+p3.y)*t3);
}
//-----------------------------------------------------------------------------------------------------
//4×4面片的插值
// 
//S*S*S*S
//          * * * * * * * 
//S*S*S*S
//          * * * * * * * 
//S*S*S*S
//          * * * * * * * 
//S*S*S*S
//  
//源图像的S像素
//
//按顺序取中间两列并计算D。
//
//S*1*2*S
//          * * * * * * *
//S*1*2*S
//**D*D**
//S*1*2*S
//          * * * * * * *
//S*1*2*S
//
//行也一样,我们将有F
//
//S*S*S*S
//          * * * * * * *
//3*3f3*3
//**D*D**
//4*4F4*4
//          * * * * * * *
//S*S*S*S
//
//然后计算对角线,在与neihbours进行平均后,将得到С
//
//1*S*S*2
//          * * * * * * *
//S*1f2*S
//**D.C.D**
//S*2f1*S
//          * * * * * * *
//2*S*S*1
//-----------------------------------------------------------------------------------------------------
表面上的空隙点(垫和src、垫和dst)
{
浮动t=0.5;
第2f点指出;
dst=材料(3,3,CV_32FC1);
// Угловые точки результата совпадают с точками центральной ячейки исходного патча
dst.at(0,0)=src.at(1,1);
dst.at(2,0)=src.at(2,1);
dst.at(0,2)=src.at(1,2);
dst.at(2,2)=src.at(2,2);
点2f-p0;
点2f p1;
点2f p2;
点2f-p3;
p0.x=0;p0.y=src.at(0,1);
p1.x=1;p1.y=src.at(1,1);
p2.x=2;p2.y=src.at(2,1);
p3.x=3;p3.y=src.at(3,1);
点曲线(out,t,p0,p1,p2,p3);
(1,0)处的dst=输出y;
p0.x=0;p0.y=src.at(0,2);
p1.x=1;p1.y=src.at(1,2);
p2.x=2;p2.y=src.at(2,2);
p3.x=3;p3.y=src.at(3,2);
点曲线(out,t,p0,p1,p2,p3);
dst.at(1,2)=输出y;
p0.x=0;p0.y=src.at(1,0);
p1.x=1;p1.y=src.at(1,1);
p2.x=2;p2.y=src.at(1,2);
p3.x=3;p3.y=src.at(1,3);
点曲线(out,t,p0,p1,p2,p3);
(0,1)处的dst=输出y;
p0.x=0;p0.y=src.at(2,0);
p1.x=1;p1.y=src.at(2,1);
p2.x=2;p2.y=src.at(2,2);
p3.x=3;p3.y=src.at(2,3);
点曲线(out,t,p0,p1,p2,p3);
(2,1)处的dst=输出y;
//对角线
// 1
p0.x=0;p0.y=src.at(0,0);
p1.x=1;p1.y=src.at(1,1);
p2.x=2;p2.y=src.at(2,2);
p3.x=3;p3.y=src.at(3,3);
点曲线(out,t,p0,p1,p2,p3);
浮点d1=out.y;
// 2
p0.x=0;p0.y=src.at(3,0);
p1.x=1;p1.y=src.at(2,1);
p2.x=2;p2.y=src.at(1,2);
p3.x=3;p3.y=src.at(0,3);
点曲线(out,t,p0,p1,p2,p3);
浮点d2=out.y;
//平均值
(1,1)点测试=1.0/6.0*(d1+d2+dst.at(0,1)+dst.at(1,0)+dst.at(1,2)+dst.at(2,1));
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
无效标度2倍(材料与材料、材料与材料)
{
Mat-imgf,img;
Mat-dst;
Mat-src;
src_img.convertTo(imgf,CV_32FC1,1.0/255.0);
cv::copyMakeBorder(imgf,img,1,1,1,cv::BORDER_REFLECT);
dstImg=Mat(src_img.rows*2,src_img.cols*2,CV_32FC1);

对于(int i=0;i感谢您@Andreasmorodovrelated:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/opencv.hpp"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;

//-----------------------------------------------------------------------------------------------------
// Take 2 points, compute values between p1 and p2, p0 and p3 need for tangents computation
// on the bouunds. Parameter t - changes in range 0 to 1 (0 - we are in p1, 1 - we are in p2)
//-----------------------------------------------------------------------------------------------------
void PointOnCurve(Point2f &out, float t, Point2f p0, Point2f p1, Point2f p2, Point2f p3)
{
    float t2 = t * t;
    float t3 = t2 * t;
    out.x = 0.5f * ( ( 2.0f * p1.x ) + ( -p0.x + p2.x ) * t +
        ( 2.0f * p0.x - 5.0f * p1.x + 4 * p2.x - p3.x ) * t2 +
        ( -p0.x + 3.0f * p1.x - 3.0f * p2.x + p3.x ) * t3 );
    out.y = 0.5f * ( ( 2.0f * p1.y ) +  ( -p0.y + p2.y ) * t +
        ( 2.0f * p0.y - 5.0f * p1.y + 4 * p2.y - p3.y ) * t2 +
        ( -p0.y + 3.0f * p1.y - 3.0f * p2.y + p3.y ) * t3 );
}
//-----------------------------------------------------------------------------------------------------
// interpolation of 4х4 patch
// 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//          * * * * * * * 
//          S * S * S * S 
//  
//          S- pixels of source imgage
//
//          sequentially take 2 middle columns and computte D.
//
//          S * 1 * 2 * S
//          * * * * * * *
//          S * 1 * 2 * S
//          * * D * D * *
//          S * 1 * 2 * S
//          * * * * * * *
//          S * 1 * 2 * S
//
//          same for rows and we will have F
//
//          S * S * S * S
//          * * * * * * *
//          3 * 3 F 3 * 3
//          * * D * D * *
//          4 * 4 F 4 * 4
//          * * * * * * *
//          S * S * S * S
//
//          then compute diagonals and after averafing with neihbours will find С
//
//          1 * S * S * 2
//          * * * * * * *
//          S * 1 F 2 * S
//          * * D C D * *
//          S * 2 F 1 * S
//          * * * * * * *
//          2 * S * S * 1
//-----------------------------------------------------------------------------------------------------
void PointOnSurface(Mat& src,Mat& dst)
{
float t=0.5;
Point2f out;
dst=Mat(3,3,CV_32FC1);
// Угловые точки результата совпадают с точками центральной ячейки исходного патча
dst.at<float>(0,0)=src.at<float>(1,1);
dst.at<float>(2,0)=src.at<float>(2,1);

dst.at<float>(0,2)=src.at<float>(1,2);
dst.at<float>(2,2)=src.at<float>(2,2);

Point2f p0;
Point2f p1;
Point2f p2;
Point2f p3;

p0.x=0;p0.y=src.at<float>(0,1);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(2,1);
p3.x=3;p3.y=src.at<float>(3,1);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(1,0)=out.y;

p0.x=0;p0.y=src.at<float>(0,2);
p1.x=1;p1.y=src.at<float>(1,2);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(3,2);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(1,2)=out.y;

p0.x=0;p0.y=src.at<float>(1,0);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(1,2);
p3.x=3;p3.y=src.at<float>(1,3);


PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(0,1)=out.y;

p0.x=0;p0.y=src.at<float>(2,0);
p1.x=1;p1.y=src.at<float>(2,1);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(2,3);

PointOnCurve(out,t,p0,p1,p2,p3);
dst.at<float>(2,1)=out.y;

// diagonals

// 1
p0.x=0;p0.y=src.at<float>(0,0);
p1.x=1;p1.y=src.at<float>(1,1);
p2.x=2;p2.y=src.at<float>(2,2);
p3.x=3;p3.y=src.at<float>(3,3);


PointOnCurve(out,t,p0,p1,p2,p3);
float d1=out.y;

// 2
p0.x=0;p0.y=src.at<float>(3,0);
p1.x=1;p1.y=src.at<float>(2,1);
p2.x=2;p2.y=src.at<float>(1,2);
p3.x=3;p3.y=src.at<float>(0,3);

PointOnCurve(out,t,p0,p1,p2,p3);
float d2=out.y;

// averaging
dst.at<float>(1,1)=1.0/6.0*(d1+d2+dst.at<float>(0,1)+dst.at<float>(1,0)+dst.at<float>(1,2)+dst.at<float>(2,1));
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
void Scale2Times(Mat& src_img,Mat &dstImg)
{
    Mat imgf,img;
    Mat dst;
    Mat src;
    src_img.convertTo(imgf,CV_32FC1,1.0/255.0);

    cv::copyMakeBorder(imgf,img,1,1,1,1,cv::BORDER_REFLECT);

    dstImg=Mat(src_img.rows*2,src_img.cols*2,CV_32FC1);

    for(int i=0;i<img.rows-4;i++)
    {
        for(int j=0;j<img.cols-4;j++)
        {
            img(Rect(j,i,4,4)).copyTo(src);
            PointOnSurface(src,dst);
            dst.copyTo(dstImg(Rect(2*j+1,2*i+1,3,3)));
        }
    }
    dstImg=dstImg(Rect(0,0,dstImg.cols-2,dstImg.rows-2)).clone();
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
    namedWindow("Src");
    namedWindow("cvResize");
    namedWindow("Catmul-Rom");
    Mat Img=imread("C:\\ImagesForTest\\1.tiff",0);
    imshow("Src",Img);
    Mat dstImg;
    Scale2Times(Img,dstImg);
    imshow("Catmul-Rom",dstImg);

    Mat ImgLin(Img.rows*2,Img.cols*2,CV_8UC1);
    cv::resize(Img,ImgLin,Size(Img.cols*2,Img.rows*2),INTER_CUBIC);
    imshow("cvResize",ImgLin);

    waitKey(0);
    //getchar();

    return 0;
}