基本概念
圖像的平滑也就是圖像的模糊處理,簡單但是使用頻率很高路鹰,在執(zhí)行許多高級處理之前都需要先進性圖像的平滑處理惨篱,以提高圖像處理算法效果盏筐。
平滑處理中需要使用濾波器,常用的是線性濾波器砸讳,作用是將輸入像素值的加權(quán)和作為結(jié)果輸出給錨點像素琢融。
g(i,j) 為輸出的錨點像素值;f(i+k,j+l) 為輸入的像素值簿寂;h(k,l) 為核
濾波過程示例:
圖像讀入到mat
介紹平滑算法之前漾抬,先調(diào)用android自帶圖庫,選擇一張圖片后返回到app中常遂,保存在一個mat對象里纳令。
//點擊按鈕,啟動圖庫
btnLoadImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent imgPickerIntent = new Intent(Intent.ACTION_PICK);
imgPickerIntent.setType("image/*");
startActivityForResult(imgPickerIntent, REQ_CODE_PICK_IMG);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_CODE_PICK_IMG) {
if (resultCode == RESULT_OK) {
try {
//獲取圖庫選擇的圖像
final Uri imgUri = data.getData();
final InputStream inputStream = getContentResolver().openInputStream(imgUri);
//圖像輸入流解析為bitmap對象
final Bitmap originImg = BitmapFactory.decodeStream(inputStream);
//根據(jù)bitmap信息初始化mat對象
src = new Mat(originImg.getHeight(), originImg.getWidth(), CvType.CV_8UC4);
//將bitmap轉(zhuǎn)換為mat對象
Utils.bitmapToMat(originImg, src);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
另外,圖像保存在mat對象中平绩,所以還需要一個顯示mat對象圖像的方法圈匆。
private void showMat() {
//根據(jù)mat對象信息初始化bitmap
Bitmap processedImg = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
//將mat對象轉(zhuǎn)換到bitmap
Utils.matToBitmap(src, processedImg);
//顯示
imgProcess.setImageBitmap(processedImg);
}
均值模糊
使用歸一化塊濾波器,也是最簡單的濾波器捏雌,輸出像素值是核窗口內(nèi)像素的均值跃赚,即所有像素加權(quán)系數(shù)相等。
核如下:
opencv-android sdk 提供的方法如下
/**
* 均值模糊
* @param src 源圖像mat
* @param dst 目標(biāo)圖像mat
* @param ksize 核大小
*/
public static void blur(Mat src, Mat dst, Size ksize)
{
//sdk封裝的一個jni方法性湿,具體的實現(xiàn)在.so庫中用c/c++實現(xiàn)
blur_2(src.nativeObj, dst.nativeObj, ksize.width, ksize.height);
return;
}
方法使用如下:
Imgproc.blur(src, src, new Size(3, 3));
showMat();
高斯模糊
高斯濾波器是最有用的濾波器(不是最快)纬傲,將輸入的每一個像素點與高斯內(nèi)核的卷積核作為輸出像素值。
高斯模糊中肤频,距離錨點像素越近的輸入像素權(quán)重越高叹括,即臨近錨點像素對像素結(jié)果的影響比那些較遠的像素要高。
高斯核是通過高斯函數(shù)獲得的
opencv-android sdk 提供的方法如下
//javadoc: GaussianBlur(src, dst, ksize, sigmaX)
public static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)
{
//sdk封裝的一個jni方法着裹,具體的實現(xiàn)在.so庫中用c/c++實現(xiàn)
GaussianBlur_2(src.nativeObj, dst.nativeObj, ksize.width, ksize.height, sigmaX);
return;
}
方法使用
Imgproc.GaussianBlur(src, src, new Size(3, 3), 0);
showMat();
中值濾波
中值濾波是將圖像的每個像素用鄰域像素的中值代替领猾。
opencv-android sdk 提供的方法如下
//javadoc: medianBlur(src, dst, ksize)
public static void medianBlur(Mat src, Mat dst, int ksize)
{
medianBlur_0(src.nativeObj, dst.nativeObj, ksize);
return;
}
方法使用
Imgproc.medianBlur(src, src, 3);
showMat();
總結(jié)
這里簡單介紹了幾種濾波器和opencv對應(yīng)的方法,并在android下進行了簡單使用骇扇,具體的代碼可以參見demo
另外摔竿,也知道了,opencv-android sdk 的方法其實都是jni封裝的c/c++的實現(xiàn)少孝,sdk中也沒有什么注釋继低,但是方法的參數(shù)和作用是和c/c++保持一致的,所以閱讀opencv官網(wǎng)上的開發(fā)文檔即可(部分章節(jié)有java的示例和說明)稍走。