对角正弦波的扭曲图像

Posted

技术标签:

【中文标题】对角正弦波的扭曲图像【英文标题】:Warp Image by Diagonal Sine Wave 【发布时间】:2020-10-23 10:48:01 【问题描述】:

我正在尝试使用 OpenCV 中的 sin 函数来扭曲彩色图像,并且我成功地这样做了。但是,如何使用正弦波进行“对角线”翘曲?

我的代码是这样的:

Mat result = src.clone();
    for (int i = 0; i < src.rows; i++)  // to y
        for (int j = 0; j < src.cols; j++)  // to x
            for (int ch = 0; ch < 3; ch++)  // each colour
                int offset_x = 0;
                int offset_y = (int)(25.0 * sin(3.14 * j / 150));
                if (i + offset_y < src.rows) 
                    result.at<Vec3b>(i, j)[ch] = src.at<Vec3b>((i + offset_y) % src.rows, j)[ch];
                
                else
                    result.at<Vec3b>(i, j)[ch] = 0.0;
            
        
    

    imshow("result", result);

我该怎么做?不是绘制正弦图,而是扭曲图像。

解决了这个问题!好几次之前,我都收到过有人告诉我图片被盗了。它实际上来自谷歌,但我已将其删除以履行不引起任何情况。谢谢!

【问题讨论】:

【参考方案1】:

我认为应该是这样的:

void deform()

    float alpha = 45 * CV_PI / 180.0; // wave direction
    float ox = cos(alpha);
    float oy = sin(alpha);
    
    cv::Mat src = cv::imread("F:/ImagesForTest/lena.jpg");

    for (int i = 0; i < src.rows; i+=8)
     
            cv::line(src, cv::Point(i, 0), cv::Point(i, src.rows),cv::Scalar(255,255,255));
    

    for (int j = 0; j < src.cols; j += 8)
     
        cv::line(src, cv::Point(0,j), cv::Point(src.cols,j), cv::Scalar(255, 255, 255));
    


    cv::Mat result = src.clone();
    for (int i = 0; i < src.rows; i++)
     // to y
        for (int j = 0; j < src.cols; j++)
         // to x
            float t =(i * oy)+ (j * ox); // wave parameter
            for (int ch = 0; ch < 3; ch++)
             // each colour
                int offset_x =ox* (int)(25.0 * (sin(3.14 * t/ 150)));
                int offset_y =oy* (int)(25.0 * (sin(3.14 * t / 150)));
                if (i + offset_y < src.rows && j + offset_x < src.rows && i + offset_y >=0 && j + offset_x>=0)
                
                    result.at<cv::Vec3b>(i, j)[ch] = src.at<cv::Vec3b>(i + offset_y, j + offset_x )[ch];
                
                else
                    result.at<cv::Vec3b>(i, j)[ch] = 0.0;
            
        
    

    cv:: imshow("result", result);
    cv::imwrite("result.jpg", result);
    cv::waitKey();

结果:

顺便说一句,使用 cv::remap 可能会更好?

【讨论】:

感谢您的回复。我明天试试这个。你能解释一下为什么“重映射”在计算机视觉领域很有用吗?我正在自学,感到很沮丧 cv::remap 允许您根据 x 和 y 映射应用图像空间的几何变换。地图描述了当前地图坐标中的像素应放置在何处。 remap 也做插值并且它高度优化。经典用法是应用镜头不失真。但可用于应用失真效果,如您的情况。

以上是关于对角正弦波的扭曲图像的主要内容,如果未能解决你的问题,请参考以下文章

急求正弦波转为方波的方法(利用单片机测1Hz~3MHz的正弦波)

急!!!用运算放大器设计一个方波、正弦波、三角波的信号发生器

一起Talk Android吧(第四百一十四回:使用三角函数绘制正弦波的优化)

Matlab来自正弦波的方波

用于拟合正弦波的神经网络

在mac上生成音调/正弦波的简单方法? (红宝石会很好)