下图是软件运行的截图:
本文只做了图像的打开和简单处理算法(图像的变亮、中值滤波、平滑滤波)的功能。其中,当软件运行时,首先调用软件内的lenna图像,显示在ImageView上。用户也可以选择媒体库中的图像。点击选择算法按钮,选择相应的处理算法(目前仅有3种),然后进行处理。图像处理的所有算法实现均由ImageProcess类管理。SystemMain.java是系统的主函数,负责调用其他Activity等。SelectAlgActivity.java是显示算法列表的,供用户选择。转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7852999
SystemMain.java
package com.example.njupt.zhb.imageprocesssystem;
import java.io.File;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class SystemMain extends Activity {
private Button selectImgBtn;
private Button selectAlgBtn;
private Button aboutBtn;
private TextView filepathView;
private TextView aboutView;
private OnClickListener seleImgBtnListener=null;
private OnClickListener seleAlgBtnListener=null;
private OnClickListener aboutBtnListener=null;
private static int RESULT_LOAD_IMAGE = 123;
private String picturePath=null;
private Bitmap myBitmap;
private ImageView myImageView;
private ImageProcess myImageProcess=new ImageProcess();
private static final String DYNAMICACTION_Broadcast = "Broadcast.njupt.zhb.selectAlg";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("ImageProcessing Made by ZhengHaibo");
setContentView(R.layout.activity_system_main);
seleImgBtnListener= new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
};
seleAlgBtnListener=new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SystemMain.this,SelectAlgActivity.class);
startActivity(intent);
}
};
aboutBtnListener=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(SystemMain.this,ActivityAbout.class);
startActivity(intent);
}
};
SetControl();
ShowImage(null);
}
private void SetControl(){
selectAlgBtn=(Button)findViewById(R.id.processBtn);
selectImgBtn=(Button)findViewById(R.id.SelectBtn);
aboutBtn=(Button)findViewById(R.id.AboutBtn);
filepathView=(TextView)findViewById(R.id.ImagePath);
aboutView=(TextView)findViewById(R.id.AboutTextView);
myImageView=(ImageView)findViewById(R.id.imageshow);
selectAlgBtn.setOnClickListener(seleAlgBtnListener);
selectImgBtn.setOnClickListener(seleImgBtnListener);
aboutBtn.setOnClickListener(aboutBtnListener);
IntentFilter filter_dynamic = new IntentFilter();
filter_dynamic.addAction(DYNAMICACTION_Broadcast);
registerReceiver(dynamicReceiver, filter_dynamic);
}
// 2 自定义动态广播接收器,内部类,接收选择的算法
private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(DYNAMICACTION_Broadcast)){
Toast.makeText(SystemMain.this, "Please wait ...", Toast.LENGTH_SHORT).show();
String seleFlag = intent.getStringExtra("selectFlag");
int ch=Integer.parseInt(seleFlag);
switch(ch){
case 0:
ShowImage(myImageProcess.brighten(10, myBitmap));
break;
case 1:
ShowImage(myImageProcess.averageFilter(3,3,myBitmap));
break;
case 2:
ShowImage(myImageProcess.averageFilter(3,3,myBitmap));
break;
default:
Toast.makeText(SystemMain.this, "Wrong!", Toast.LENGTH_SHORT).show();
break;
}
Toast.makeText(SystemMain.this, "Processing finished!", Toast.LENGTH_SHORT).show();
}
}
};
private Bitmap FilesToBitmap(String filename){
Bitmap temp=null;
if(filename!=null){
File imageFile = new File(filename);
if (imageFile.exists())
{
// Load the image from file
temp = BitmapFactory.decodeFile(filename);
}
}
return temp;
}
public void ShowImage(Bitmap bitmap){
if (bitmap!=null) {
myImageView.setImageBitmap(bitmap);
}
else {
bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.lenna);
myImageView.setImageBitmap(bitmap);
myBitmap=bitmap;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
picturePath = cursor.getString(columnIndex);
cursor.close();
filepathView.setText(picturePath);
//imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
myBitmap=FilesToBitmap(picturePath);
ShowImage(myBitmap);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_system_main, menu);
return true;
}
}
SelectAlgActivity.java
package com.example.njupt.zhb.imageprocesssystem;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
public class SelectAlgActivity extends Activity implements OnItemClickListener{
private static final String DYNAMICACTION_Broadcast = "Broadcast.njupt.zhb.selectAlg";
private ListView listView;
public void sendFlagToActivity(String flag){
Intent intent = new Intent();
intent.setAction(DYNAMICACTION_Broadcast);
intent.putExtra("selectFlag", flag);
sendBroadcast(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Choose Image processing type!");
listView = new ListView(this);
List<String> list=getData();
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);
listView.setAdapter(adapter);
setContentView(listView);
listView.setOnItemClickListener(this);//绑定监听接口
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("图像变亮");
data.add("中值滤波");
data.add("平滑滤波");
return data;
}
/*实现OnItemClickListener接口*/
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
//finish();
String posString=Integer.toString(position);
sendFlagToActivity(posString);
finish();
}
}
ImageProcess.java
package com.example.njupt.zhb.imageprocesssystem;
import android.graphics.Bitmap;
public class ImageProcess {
public ImageProcess() {
// TODO Auto-generated constructor stub
}
public Bitmap brighten(int brightenOffset,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pix = new int[width * height];
myBitmap.getPixels(pix, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int index = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int r = (pix[index] >> 16) & 0xff;
int g = (pix[index] >> 8) & 0xff;
int b = pix[index] & 0xff;
r = Math.max(0, Math.min(255, r + brightenOffset));
g = Math.max(0, Math.min(255, g + brightenOffset));
b = Math.max(0, Math.min(255, b + brightenOffset));
pix[index] = 0xff000000 | (r << 16) | (g << 8) | b;
index++;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pix, 0, width, 0, 0, width, height);
myBitmap = null;
pix = null;
return bitmap;
}
// filterWidth and filterHeight must be odd numbers
public Bitmap averageFilter(int filterWidth, int filterHeight,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pixNew = new int[width * height];
int[] pixOld = new int[width * height];
myBitmap.getPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap.getPixels(pixOld, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int filterHalfWidth = filterWidth/2;
int filterHalfHeight = filterHeight/2;
int filterArea = filterWidth * filterHeight;
for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
{
for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
{
// Accumulate values in neighborhood
int accumR = 0, accumG = 0, accumB = 0;
for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
{
for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
{
int index = (y+dy)*width + (x+dx);
accumR += (pixOld[index] >> 16) & 0xff;
accumG += (pixOld[index] >> 8) & 0xff;
accumB += pixOld[index] & 0xff;
} // dx
} // dy
// Normalize
accumR /= filterArea;
accumG /= filterArea;
accumB /= filterArea;
int index = y*width + x;
pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap = null;
pixOld = null;
pixNew = null;
return bitmap;
}
// filterWidth and filterHeight must be odd numbers
public Bitmap medianFilter(int filterWidth, int filterHeight,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pixNew = new int[width * height];
int[] pixOld = new int[width * height];
myBitmap.getPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap.getPixels(pixOld, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int filterHalfWidth = filterWidth/2;
int filterHalfHeight = filterHeight/2;
int filterArea = filterWidth * filterHeight;
for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
{
for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
{
// Accumulate values in neighborhood
int accumR = 0, accumG = 0, accumB = 0;
for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
{
for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
{
int index = (y+dy)*width + (x+dx);
accumR += (pixOld[index] >> 16) & 0xff;
accumG += (pixOld[index] >> 8) & 0xff;
accumB += pixOld[index] & 0xff;
} // dx
} // dy
// Normalize
accumR /= filterArea;
accumG /= filterArea;
accumB /= filterArea;
int index = y*width + x;
pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap = null;
pixOld = null;
pixNew = null;
return bitmap;
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget38"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/ImagePath"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ImageProcess" />
<Button
android:id="@+id/SelectBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Select Image" />
<Button
android:id="@+id/processBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Select Image Pcocessing Algorithm" />
<ImageView
android:id="@+id/imageshow"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/AboutBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="About author" />
<TextView
android:id="@+id/AboutTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="zhb931706659@126.com njupt zhb" />
</LinearLayout>
分享到:
相关推荐
基于Android系统的图像处理软件是一种允许用户在移动设备上进行图像编辑和处理的应用程序。这类软件通常提供各种功能和工具,让用户能够对照片和图像进行各种操作,例如裁剪、调整亮度和对比度、滤镜效果、涂鸦和...
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
【探索人工智能的宝藏之地】 无论您是计算机相关专业的在校学生、老师,还是企业界的探索者,这个项目都是为您量身打造的。无论您是初入此领域的小白,还是寻求更高层次进阶的资深人士,这里都有您需要的宝藏。不仅...
深度学习在图像处理领域的发展过程; 解析经典的卷积神经网络; 垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练...
一款基于DCT算法的水印嵌入和提取的移动智能终端数字图像证据系统Android APP,水印载体形式包括二维码和图片两种,在简易模式下,水印信息仅包括IMEI;在完整模式下,水印信息包括地点、时间、IMEI、Android ID。 ...
android开发期末大作业(项目源码,任务书,实验大报告,apk文件) 大作业的要求和内容:(包括题目选择范围、技术... 图形图像处理、多媒体处理等 分值10 5、考核方式为面对面答辩,在课程的后两周内集中进行。
使用OpenCV、Android和Java Web可以实现一个简单的人脸识别系统,该系统可以通过摄像头实时捕获人脸图像,并进行比对识别,从而实现用户身份认证等应用场景。这个系统可以分为客户端和服务器两个部分。 客户端使用...
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
主要包括Android开发技术基础、获取并编译源码、Android技术核心框架分析、...Android蓝牙系统概述、低功耗蓝牙技术详解、语音识别技术详解、手势识别技术详解、NFC近场通信技术详解、拍照解析条形码技术详解、基于图像...
如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、...
由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...
这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...
它结合了美观的设计和强大的图像处理功能,为用户提供了一个全新的照片管理体验。 主要特点: 1. **仿iOS相机胶卷界面**:应用界面设计简洁大方,模仿了iOS系统相机胶卷的布局,让用户在Android设备上也能体验到...
如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、...
如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、...
《Android基础教程(第3版·修订版)》适合所有移动开发人员学习参考。 目录 第一部分 Android简介 第1章 快速入门 1.1 安装工具 1.1.1 Java 5.0+ 1.1.2 Eclipse 3 1.1.3 AndroidSDK启动程序软件包 1.1.4 Android...
第7章、图形与图像处理 第8章、Android的数据存储和IO 第9章、使用ContentProvider实现数据共享 第10章、Service与BroadcastReceiver 第11章、多媒体应用开发 第12章、OpenGL与3D应用开发 第13章、Android的网络应用...