OpenCV之摩尔纹

摩尔纹

        用数码相机拍摄景物中,如果有密纹的纹理,常常会出现莫名其妙的水波样条纹。这就是摩尔纹。简单的说,摩尔纹是差拍原理的一种表现。从数学上讲,两个频率接近的等幅正弦波叠加,合成信号的幅度将按照两个频率之差变化。差拍原理广泛应用到广播电视和通信中,用来变频、调制等。同样,差拍原理也适用于空间频率。空间频率略有差异的条纹叠加,由于条纹间隔的差异、重合位置会逐渐偏移,也会形成差拍。

 摩尔纹的实现

源码:

void add_moire_noise(Mat& src,Mat& dst,Point center,int degree)
{
    int width = src.cols;
    int heigh = dst.rows;
    for (int y = 0; y < heigh; y++)
    {
        uchar* data = dst.ptr<uchar>(y);
        uchar* data0 = src.ptr<uchar>(y);
        for (int x = 0; x < width; x++)
        {

            Point offset(x - center.x, y - center.y);
            double theta = atan2((double)offset.y, (double)offset.x);
            double rou = sqrt(pow((double)offset.x, 2) + pow((double)offset.y, 2));

            int newX = center.x + rou * cos(theta + degree * rou);
            int newY = center.y + rou * sin(theta + degree * rou);

            if (newX < 0)
                newX = 0;
            else if (newX >= width)
                newX = width - 1;

            if (newY < 0)
                newY = 0;
            else if (newY >= heigh)
                newY = heigh - 1;

            data[3 * x] = 0.8 * data0[3 * x]+ 0.2 * src.at<uchar>(newY, newX * 3);
            data[3 * x + 1] = 0.8 * data0[3 * x + 1]+ 0.2 * src.at<uchar>(newY, newX * 3 + 1);
            data[3 * x + 2] = 0.8 * data0[3 * x + 2]+ 0.2 * src.at<uchar>(newY, newX * 3 + 2);
        }
    }
}

原图:

 

 摩尔纹:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视图猿人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值