Image Processing In Android Part II

This example will explain how to apply blur effect on bitmap. Lets try to do this our self without using any API. This can be done using Convolution Matrix according to the Image Processing example explained in previous post. In this example, we will use Gaussian matrix which is used as the 7 x 7 kernal to convolve image to apply Gaussian blur.
Algorithm:

1.) Create a new project by File-> New -> Android Project name it ImageProcessingExamplePart2.

2.) Write following into main.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Original" />
<ImageView
android:id="@+id/imageSource"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/thumb"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Result" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAfter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>

</LinearLayout>
</ScrollView>
</LinearLayout>

 

3.) Add a image file which we will display into res/drawable folder.

4.) Run for output.

Steps:

1.) Create a project named ImageProcessingExamplePart2 and set the information as stated in the image.

Build Target: Android 4.4
Application Name: ImageProcessingExamplePart2
Package Name: com.example.ImageProcessingExamplePart2
Activity Name: ImageProcessingExamplePart2Activity

imagepart21

2.) Open ImageProcessingExamplePart2Activity.java file and write following code there:

 

package com.example.imageprocessingexamplepart2;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class ImageProcessingExamplePart2Activity extends Activity {

final static int KERNAL_WIDTH = 7;
final static int KERNAL_HEIGHT = 7;

int[][] kernal_GaussianMatrix = {
{67, 2292, 19117, 38771, 19117, 2292, 67 },
{2292, 78633, 655965, 1330373, 655965, 78633, 2292 },
{19117, 655965, 5472157, 11098164, 5472157, 655965, 19117 },
{38771, 1330373, 11098164, 22508352, 11098164, 1330373, 38771 },
{19117, 655965, 5472157, 11098164, 5472157, 655965, 19117 },
{2292, 78633, 655965, 1330373, 655965, 78633, 2292 },
{67, 2292, 19117, 38771, 19117, 2292, 67 }
};

ImageView imageSource, imageAfter;
Bitmap bitmap_Source;
ProgressBar progressBar;

private Handler handler;
Bitmap afterProcess;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageSource = (ImageView)findViewById(R.id.imageSource);
imageAfter = (ImageView)findViewById(R.id.imageAfter);
progressBar = (ProgressBar)findViewById(R.id.progressBar);

bitmap_Source = BitmapFactory.decodeResource(getResources(), R.drawable.thumb);

handler = new Handler();
StratBackgroundProcess();
}

private void StratBackgroundProcess(){

Runnable runnable = new Runnable(){

@Override
public void run() {
afterProcess = processingBitmap(bitmap_Source, kernal_GaussianMatrix);

handler.post(new Runnable(){

@Override
public void run() {
progressBar.setVisibility(View.GONE);
imageAfter.setImageBitmap(afterProcess);
}

});
}
};
new Thread(runnable).start();
}

private Bitmap processingBitmap(Bitmap src, int[][] knl){
Bitmap dest = Bitmap.createBitmap(
src.getWidth(), src.getHeight(), src.getConfig());

int bmWidth = src.getWidth();
int bmHeight = src.getHeight();
int bmWidth_MINUS_6 = bmWidth - 6;
int bmHeight_MINUS_6 = bmHeight - 6;
int bmWidth_OFFSET_3 = 3;
int bmHeight_OFFSET_3 = 3;

for(int i = bmWidth_OFFSET_3; i <= bmWidth_MINUS_6; i++){
for(int j = bmHeight_OFFSET_3; j <= bmHeight_MINUS_6; j++){

//get the surround 7*7 pixel of current src[i][j] into a matrix subSrc[][]
int[][] subSrc = new int[KERNAL_WIDTH][KERNAL_HEIGHT];
for(int k = 0; k < KERNAL_WIDTH; k++){
for(int l = 0; l < KERNAL_HEIGHT; l++){
subSrc[k][l] = src.getPixel(i-bmWidth_OFFSET_3+k, j-bmHeight_OFFSET_3+l);
}
}

//subSum = subSrc[][] * knl[][]
long subSumR = 0;
long subSumG = 0;
long subSumB = 0;

for(int k = 0; k < KERNAL_WIDTH; k++){
for(int l = 0; l < KERNAL_HEIGHT; l++){
subSumR += (long)(Color.red(subSrc[k][l])) * (long)(knl[k][l]);
subSumG += (long)(Color.green(subSrc[k][l])) * (long)(knl[k][l]);
subSumB += (long)(Color.blue(subSrc[k][l])) * (long)(knl[k][l]);
}
}

subSumR = subSumR/100000000;
subSumG = subSumG/100000000;
subSumB = subSumB/100000000;

if(subSumR <0){
subSumR = 0;
}else if(subSumR > 255){
subSumR = 255;
}

if(subSumG <0){
subSumG = 0;
}else if(subSumG > 255){
subSumG = 255;
}

if(subSumB <0){
subSumB = 0;
}else if(subSumB > 255){
subSumB = 255;
}

dest.setPixel(i, j, Color.argb(
Color.alpha(src.getPixel(i, j)),
(int)subSumR,
(int)subSumG,
(int)subSumB));
}
}

return dest;
}
}

 

 

3.) Compile and build the project.

Output

imagepart22

imagepart23