環(huán)境配置 :
矩陣掩碼操作:根據(jù)掩碼矩陣(也稱作核)重新計(jì)算圖像中每個(gè)像素的值芦鳍。掩碼矩陣中的值表示近鄰像素值(包括該像素自身的值)對(duì)新像素值有多大影響。從數(shù)學(xué)觀點(diǎn)看激挪,我們用自己設(shè)置的權(quán)值狈邑,對(duì)像素鄰域內(nèi)的值做了個(gè)加權(quán)平均碗啄。
運(yùn)行效果:
代碼示例:
void Sharpen(const Mat& myImage, Mat& Result, int n) {?
? ? ? ? CV_Assert(myImage.depth() == CV_8U); ?
? ? ? ? Result.create(myImage.size(),myImage.type());?
? ? ? ? const int nChannels = ? ? ? myImage.channels();? ? ??
? ? ? ? for(int j = 1 ; j < myImage.rows-1; ++j)? ? {? ? ? ?
? ? ? ? ? ? ? ? ?const uchar* previous = myImage.ptr(j - 1);? ?
? ? ? ? ? ? ? ? ?const uchar* current? = myImage.ptr(j );?
? ? ? ? ? ? ? ? ?const uchar* next? ? = myImage.ptr(j + 1);
? ? ? ? ? ? ? ? ?uchar* output = Result.ptr(j);?
? ? ? ? ? ? ? ? ?for(int i= nChannels; i < nChannels*(myImage.cols-1); ++i)? ? ? ? { ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? *output++ = saturate_cast(n * current[i]
? ? ? ? ? ? ? ? ? ? ? ? - current[i - nChannels] - current[i+nChannels] - previous[i] - ? ?next[i]);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? }
// 邊界處理
? ? ? ? Result.row(0).setTo(Scalar(0));? ? ? ? ? ? ? ? ? // 上
? ? ? ? Result.row(Result.rows-1).setTo(Scalar(0));? ? ? // 下
? ? ? ? Result.col(0).setTo(Scalar(0));? ? ? ? ? ? ? ? ? // 左
? ? ? ? Result.col(Result.cols-1).setTo(Scalar(0));? ? ? // 右
}
調(diào)用方式:
Mat myImage, result;
UIImage *img = [UIImage imageNamed:@"imageName"];
UIImageToMat(img, myImage); ? // 將UIImage對(duì)象轉(zhuǎn)換成 Mat
Sharpen(myImage, result, n); ? // myImage:預(yù)處理對(duì)象 result:處理結(jié)果 n:可以隨便填試試 建議在 5+-n
UIImage *img2 = MatToUIImage(result); ? ? // 將Mat轉(zhuǎn)換成 UIImage 對(duì)象
參考資料:?矩陣的掩碼操作