iOS-OpenCV對比度增強(qiáng)(矩陣掩碼操作)

在本章通過矩陣的掩碼操作重新計(jì)算圖像中每個(gè)像素的值,掩碼矩陣中的值表示鄰近像素的值對新的像素值有多大的影響。我們利用以下的公式來實(shí)現(xiàn)增強(qiáng)對比度的效果。

  • I(i,j) = 5*I(i,j) - [I(i-1,j) -I(i+1,j) - I(i,j-1) - I(i,j+1)];

  • 矩陣掩碼的設(shè)置為
    0 -1 0
    (-1 5 -1)
    0 -1 0

  • 首先使用基本的像素訪問方法來實(shí)現(xiàn)對比度增強(qiáng)函數(shù),然后我們再用opencv庫中的filter2D函數(shù)來實(shí)現(xiàn)相同的效果,通過計(jì)算調(diào)用的時(shí)間來對比兩種方法的優(yōu)劣性。

  • 基本方法

void Sharpen (const Mat& myPicture,Mat& resultPicture)
{
    CV_Assert(myPicture.depth() == CV_8U);
    resultPicture.create(myPicture.size(), myPicture.type());
    const int myChannels = myPicture.channels();
    for(int i  = 1;i < myPicture.rows - 1; ++ i)
    {
        const uchar* previous = myPicture.ptr<uchar>(i - 1);
        const uchar* current = myPicture.ptr<uchar>(i);
        const uchar* next = myPicture.ptr<uchar>(i+1);
        uchar* output = resultPicture.ptr<uchar>(i);
        
        for(int j = myChannels; j < (myPicture.cols - 1)*myChannels; ++ j)
        {
            *output++ = saturate_cast<uchar>(5*current[j] - current[j - myChannels] - current[j + myChannels] - previous[j] - next[j]);
        }
        
        resultPicture.row(0).setTo(Scalar(0));
        resultPicture.row(resultPicture.rows-1).setTo(Scalar(0));
        resultPicture.col(0).setTo(Scalar(0));
        resultPicture.col(resultPicture.cols-1).setTo(Scalar(0));
    }
}
  • filter2D函數(shù)方法
void Sharpenx (const Mat& myPicture , Mat& resultPicture)
{
    Mat kern = (Mat_<char>(3,3) << 0, -1 , 0 ,
                                   -1, 5 ,-1 ,
                                    0, -1, 0);
    filter2D(myPicture,resultPicture, myPicture.depth(), kern);
}
  • 我們使用以下的調(diào)用過程來處理圖片,并且輸出調(diào)用兩個(gè)函數(shù)分別花費(fèi)的時(shí)間
- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect rect = [UIScreen mainScreen].bounds;
    self.imgView.frame = rect;
    
    UIImage *image = [UIImage imageNamed:@"test.jpg"];
    UIImageToMat(image, myPictureMat);
    
    double t = (double)getTickCount();//得到某段時(shí)間以來CPU走過的時(shí)鐘周期數(shù)
    Sharpenx(myPictureMat, resultPictureMat);
    
    t = ((double)getTickCount() - t)/getTickFrequency();//getTickFrequency()函數(shù)返回CPU1s中所走的時(shí)鐘周期數(shù)
    cout<< "--------------cost:" << t <<" seconds-----------------" <<endl;
    
    self.imgView.image = MatToUIImage(resultPictureMat);
        
}
  • 基本方法花費(fèi)時(shí)間0.0142秒,filter2D方法花費(fèi)時(shí)間0.0057秒
sharpen.png
sharpenx.png
  • 可以得出filter2D的方法要比自己實(shí)現(xiàn)的方法要快
    最后是效果圖展示:
test1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容