コンピュータビジョンチュートリアル2-8:画像ボケ効果の原理を知っていますか?(コード付き)

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して5日目です。クリックしてイベントの詳細をご覧ください


前に0が書かれています

この記事の最後で実現した背景ぼかし効果のように、被写体にピントを合わせて背景をぼかす効果であるぼかし効果を、カメラを使ったことのある学生は知っていると思います。
ここに画像の説明を挿入

カメラブラー効果の背後にある原理は何ですか?それはコンピュータビジョンと何の関係がありますか?この記事では、これらの質問について説明します。

1小穴イメージング

小学校では、光がなければ画像は存在しないことを知っています。画像を生成するには、シーンに1つ以上の直接または間接の光源が必要です。

ここに画像の説明を挿入図に示すように、照明は主に3つのカテゴリに分類されます。

  • 散乱
  • 直射日光
  • 拡散反射

光源が得られた後、物体から検出面への光線が生成されます。

物体上のある点Aから検出面に到達する散乱光線は無数にあるため、Aの撮像点A'は撮像面に均等に分布していると考えられ、他の点についても同様です。したがって、この場合、検出面は無数のオブジェクト画像のエイリアシングであり、ぼやけた、または不可能な画像にさえなります。

ここに画像の説明を挿入

白い紙に直面していると、あなたの顔が見えません。白い紙にあなたからの光がないからではなく、あなたのさまざまな部分からの光が白い紙に重なっているからです。信じてはいけません。それを試してみてください?

白い紙にイメージする方法は?

実は、小学校で試した小穴イメージングを使って、とてもシンプルです。

ここに画像の説明を挿入基本的に、小さな穴は== filter ==と同等であり、オブジェクトポイントからの光線をわずかしか保持しないため、この時点で鮮明な画像を取得する必要があります。

2光学イメージング

ピンホールイメージングの欠点は、イメージング光が少なく、輝度が低いことです。より多くの光を得て、画像点が検出面に散乱して画像が重なるのを防ぐために、集光レンズが導入されています。レンズイメージングとピンホールイメージングの本質は、散乱画像ポイントによるイメージング不能を回避することです。前者は集光光を使用し、後者はフィルタリングを使用します。

ここに画像の説明を挿入 现代相机在应用上通常使用透镜成像,但不管是透镜成像还是小孔成像,都是计算机视觉研究的基本模型和假设,例如透视几何相机内参矩阵畸变修正等等,因此本节对于建立机器视觉的研究思维很有帮助。

3 虚化效果

介绍完前面的基础知识,终于开始图像虚化特效的原理啦!

理想透镜应保证光线聚焦于一点——焦点,这个点不会产生任何成像混叠,图像最清晰。在焦点前后光线开始四散,形成不同程度的成像重叠区域,称为弥散圆,对于人眼而言,在一定范围内影象产生的模糊是不能辨认的,不能辨认的弥散圆范围称为容许弥散圆

ここに画像の説明を挿入

当对被摄主体平面调焦时,因为容许弥散圆的存在,在一定离焦范围内,成像仍然清晰,这个范围称为焦深。调整成像面和镜头距离,使成像面处于焦深内,物体可以清晰成像的过程,称为对焦

类似地,对被摄物体而言,位于调焦物平面前后的能相对清晰成像的景物间纵深距离称为景深。图像虚化效果就和这个景深有关系!

  • 景深越小,被摄物体前后能清晰成像的范围越小,也就相应地出现朦胧虚化的效果
  • 景深越大,被摄物体前后能清晰成像的范围越大,也就没有虚化效果

ここに画像の説明を挿入 如何调节景深?记住一句话:光圈越大景深越小,所以拿手机拍照的时候,大光圈也就代表了虚化效果!

所以下次有机会给女生拍照的话,请先确认

“请问你喜欢小景深还是大景深?”

4 代码实战

カメラの背景ぼかし効果は、画像処理でガイド付きフィルターを使用することで実現できます。ソースコードは次のとおりです。

//引导滤波器
Mat guidedFilter(Mat& srcMat, Mat& guidedMat, int radius, double eps)
{
    srcMat.convertTo(srcMat, CV_64FC1);
    guidedMat.convertTo(guidedMat, CV_64FC1);
    // 计算均值
    Mat mean_p, mean_I, mean_Ip, mean_II;
    boxFilter(srcMat, mean_p, CV_64FC1, Size(radius, radius));                      // 生成待滤波图像均值mean_p 
    boxFilter(guidedMat, mean_I, CV_64FC1, Size(radius, radius));                   // 生成引导图像均值mean_I   
    boxFilter(srcMat.mul(guidedMat), mean_Ip, CV_64FC1, Size(radius, radius));      // 生成互相关均值mean_Ip
    boxFilter(guidedMat.mul(guidedMat), mean_II, CV_64FC1, Size(radius, radius));   // 生成引导图像自相关均值mean_II
    // 计算相关系数、Ip的协方差cov和I的方差var------------------
    Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
    Mat var_I = mean_II - mean_I.mul(mean_I);
    // 计算参数系数a、b
    Mat a = cov_Ip / (var_I + eps);
    Mat b = mean_p - a.mul(mean_I);
    // 计算系数a、b的均值
    Mat mean_a, mean_b;
    boxFilter(a, mean_a, CV_64FC1, Size(radius, radius));
    boxFilter(b, mean_b, CV_64FC1, Size(radius, radius));
    // 生成输出矩阵
    Mat dstImage = mean_a.mul(srcMat) + mean_b;
    return dstImage;
}
复制代码

次回は、ガイド付きフィルターの関連原理について新しい章を開きます。

フィルタはmain関数で呼び出すことができ、効果はテキストの先頭に表示されます。

int main()
{
    Mat resultMat; 
    Mat vSrcImage[3], vResultImage[3];
    Mat vResultImage[3];    
    Mat srcImage = imread("1.jpg");
    imshow("源图像", srcImage);
    // 对源图像进行通道分离,并对每个分通道进行引导滤波
    split(srcImage, vSrcImage);
    for (int i = 0; i < 3; i++)
    {
        Mat tempImage;
        vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0);
        Mat cloneImage = tempImage.clone();
        Mat resultImage = guidedFilter(tempImage, cloneImage, 5, 0.3);
        vResultImage[i] = resultImage;
    }
    // 将分通道导向滤波后结果合并
    merge(vResultImage, 3, resultMat);
    imshow("背景虚化特效", resultMat);
    waitKey(0);
    return 0;
}
复制代码

光学イメージングのさまざまな原理を含む小さな画像ぼかし効果は、コンピュータビジョンモデルの基盤を構築します。私たち一人一人のように、あなたはとても小さいと感じるかもしれません、多分あなたは他の人の主力です!

完全なプロジェクトファイルに注意してください〜


コンピュータビジョンの基礎コースの概要

チャプター番号コンテンツ

  0色空間とデジタル画像

  1コンピュータ幾何学の基礎

  2画像強調、フィルタリング、ピラミッド

  3画像特徴抽出

  4画像機能の説明

  5画像の特徴のマッチング

  6立体視

  7プロジェクト戦闘

より高品質なコンテンツとサポートコードを私のAIチャンネル「AIテクノロジークラブ」に歓迎します

おすすめ

転載: juejin.im/post/7082937637576638500
おすすめ