亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV圖像處理中如何利用多尺度融合提升圖像細節

發布時間:2021-12-15 18:00:45 來源:億速云 閱讀:186 作者:柒染 欄目:大數據

OpenCV圖像處理中如何利用多尺度融合提升圖像細節,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

今天為大家介紹一個利用多尺度來提升圖像細節的算法。如果你想自己的圖片細節看起來更加豐富的話可以嘗試一下這個算法。

 

算法原理

核心就是,論文使用了Retinex方法類似的思路,使用了多個尺度的高斯核對原圖濾波,然后再和原圖做減法,獲得不同程度的細節信息,然后通過一定的組合方式把這些細節信息融合到原圖中,從而得到加強原圖信息的能力。公式十分簡單,注意到第一個系數有點特殊,實現的話,直接看下圖的幾個公式即可。

「從深度學習中特征金字塔網絡的思想來看,這個算法實際上就是將不同尺度上的特征圖進行了融合,不過這個方式是直接針對原圖進行,比較粗暴,但有個好處就是這個算法用于預處理階段是易于優化的,關于如何優化后面講SSE指令集優化的時候再來討論,今天先提供原始的實現啦。」

OpenCV圖像處理中如何利用多尺度融合提升圖像細節  
在這里插入圖片描述
 

代碼實現

void separateGaussianFilter(const Mat &src, Mat &dst, int ksize, double sigma){
   CV_Assert(src.channels()==1 || src.channels() == 3); //只處理單通道或者三通道圖像
   //生成一維的
   double *matrix = new double[ksize];
   double sum = 0;
   int origin = ksize / 2;
   for(int i = 0; i < ksize; i++){
       double g = exp(-(i-origin) * (i-origin) / (2 * sigma * sigma));
       sum += g;
       matrix[i] = g;
   }
   for(int i = 0; i < ksize; i++) matrix[i] /= sum;
   int border = ksize / 2;
   copyMakeBorder(src, dst, border, border, border, border, BORDER_CONSTANT);
   int channels = dst.channels();
   int rows = dst.rows - border;
   int cols = dst.cols - border;
   //水平方向
   for(int i = border; i < rows; i++){
       for(int j = border; j < cols; j++){
           double sum[3] = {0};
           for(int k = -border; k<=border; k++){
               if(channels == 1){
                   sum[0] += matrix[border + k] * dst.at<uchar>(i, j+k);
               }else if(channels == 3){
                   Vec3b rgb = dst.at<Vec3b>(i, j+k);
                   sum[0] += matrix[border+k] * rgb[0];
                   sum[1] += matrix[border+k] * rgb[1];
                   sum[2] += matrix[border+k] * rgb[2];
               }
           }
           for(int k = 0; k < channels; k++){
               if(sum[k] < 0) sum[k] = 0;
               else if(sum[k] > 255) sum[k] = 255;
           }
           if(channels == 1)
               dst.at<Vec3b>(i, j) = static_cast<uchar>(sum[0]);
           else if(channels == 3){
               Vec3b rgb = {static_cast<uchar>(sum[0]), static_cast<uchar>(sum[1]), static_cast<uchar>(sum[2])};
               dst.at<Vec3b>(i, j) = rgb;
           }
       }
   }
   //豎直方向
   for(int i = border; i < rows; i++){
       for(int j = border; j < cols; j++){
           double sum[3] = {0};
           for(int k = -border; k<=border; k++){
               if(channels == 1){
                   sum[0] += matrix[border + k] * dst.at<uchar>(i+k, j);
               }else if(channels == 3){
                   Vec3b rgb = dst.at<Vec3b>(i+k, j);
                   sum[0] += matrix[border+k] * rgb[0];
                   sum[1] += matrix[border+k] * rgb[1];
                   sum[2] += matrix[border+k] * rgb[2];
               }
           }
           for(int k = 0; k < channels; k++){
               if(sum[k] < 0) sum[k] = 0;
               else if(sum[k] > 255) sum[k] = 255;
           }
           if(channels == 1)
               dst.at<Vec3b>(i, j) = static_cast<uchar>(sum[0]);
           else if(channels == 3){
               Vec3b rgb = {static_cast<uchar>(sum[0]), static_cast<uchar>(sum[1]), static_cast<uchar>(sum[2])};
               dst.at<Vec3b>(i, j) = rgb;
           }
       }
   }
   delete [] matrix;
}

Mat MultiScaleDetailBoosting(Mat src, int Radius){
   int rows = src.rows;
   int cols = src.cols;
   Mat B1, B2, B3;
   separateGaussianFilter(src, B1, Radius, 1.0);
   separateGaussianFilter(src, B2, Radius*2-1, 2.0);
   separateGaussianFilter(src, B3, Radius*4-1, 4.0);
   float w1 = 0.5, w2 = 0.5, w3 = 0.25;
   Mat dst(rows, cols, CV_8UC3);
   for(int i = 0; i < rows; i++){
       for(int j = 0; j < cols; j++){
           for(int k = 0; k < 3; k++){
               int D1 = src.at<Vec3b>(i, j)[k] - B1.at<Vec3b>(i, j)[k];
               int D2 = B1.at<Vec3b>(i, j)[k] - B2.at<Vec3b>(i, j)[k];
               int D3 = B2.at<Vec3b>(i, j)[k] - B3.at<Vec3b>(i, j)[k];
               int sign = D1 > 0 ? 1 : -1;
               dst.at<Vec3b>(i, j)[k] = saturate_cast<uchar>((1 - w1*sign) * D1 - w2 * D2 + w3 * D3 + src.at<Vec3b>(i, j)[k]);
           }
       }
   }
   return dst;
}
   

效果

OpenCV圖像處理中如何利用多尺度融合提升圖像細節  
原圖
OpenCV圖像處理中如何利用多尺度融合提升圖像細節  
效果圖
    

關于OpenCV圖像處理中如何利用多尺度融合提升圖像細節問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太康县| 德令哈市| 普宁市| 马尔康县| 华蓥市| 兴山县| 鹤山市| 仙游县| 焦作市| 吴江市| 凤山市| 纳雍县| 吉水县| 沁源县| 广饶县| 庄河市| 团风县| 泸水县| 靖西县| 长宁县| 洞口县| 五莲县| 京山县| 乐昌市| 长葛市| 北票市| 军事| 深水埗区| 花莲市| 都江堰市| 海南省| 象山县| 长岭县| 屯留县| 卓尼县| 广宁县| 汉沽区| 宣恩县| 通江县| 松原市| 桐乡市|