首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用对角正弦波实现翘曲图像

用对角正弦波实现翘曲图像
EN

Stack Overflow用户
提问于 2020-10-23 10:48:02
回答 1查看 261关注 0票数 0

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

我的代码是:

代码语言:javascript
运行
AI代码解释
复制
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);

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

解决了这个问题!几次前,我收到一个人的消息,他告诉我图片被盗了。它来自谷歌,实际上,但我已经删除了它,以满足不造成任何情况。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-23 12:01:36

我认为它应该是这样的:

代码语言:javascript
运行
AI代码解释
复制
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可能更好?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64498601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档