android中opencv操作图片像素----之图像灰度处理
2017-12-19 13:11
666 查看
灰度图 以数组存储每个像素的数据,每个数据叫做一个灰度值
彩色图像灰度处理公式:R*0.299+G*0.587+B*0.114
方式一:指针操作。
方式二:迭代器处理。
方式三:动态地址计算。
这三种方式中,性能最好的是第一种,耗时少,第二种和第三种耗时差不多,但第二种使用了迭代器,可以保证不会越界,安全性高,第三种方式使用了Mat中的方法动态操作地址中的数据,便于理解。
彩色图像灰度处理公式:R*0.299+G*0.587+B*0.114
方式一:指针操作。
extern "C" { JNIEXPORT jintArray JNICALL Java_com_xy_opencv_ndk_1opencv002_MainActivity_grayPixels(JNIEnv *env, jclass type, jintArray pixels_, jint w, jint h) { jint *pixels = env->GetIntArrayElements(pixels_, NULL); if (pixels == NULL) { return 0; } //图片一进来时是ARGB 通过mat转换BGRA Mat img(h, w, CV_8UC4, pixels); //读取返回一个uchar数组 uchar* ptr = img.ptr(0); //获取当前CPU的钟摆时间 double time0 = static_cast<double>(getTickCount()); /** * 指针处理 */ //灰度处理图片 for(int i = 0; i < w * h; i++){ //R*0.299 + G * 0.587 + B * 0.114 uchar grayPixel = (uchar)(ptr[4*i+2]*0.299+ptr[4*i+1]*0.587+ptr[4*i+0]*0.114); ptr[4*i+0] = grayPixel; ptr[4*i+1] = grayPixel; ptr[4*i+2] = grayPixel; } //计算运行时间 time0 = ((double)getTickCount() - time0)/getTickFrequency(); __android_log_print(ANDROID_LOG_INFO,"JNI","%ld",time0); int size = w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, pixels); env->ReleaseIntArrayElements(pixels_,pixels,0); env->ReleaseIntArrayElements(pixels_, pixels, 0); return result; } }
方式二:迭代器处理。
extern "C" { JNIEXPORT jintArray JNICALL Java_com_xy_opencv_ndk_1opencv002_MainActivity_grayPixels(JNIEnv *env, jclass type, jintArray pixels_, jint w, jint h) { jint *pixels = env->GetIntArrayElements(pixels_, NULL); if (pixels == NULL) { return 0; } //图片一进来时是ARGB 通过mat转换BGRA Mat img(h, w, CV_8UC4, pixels); //获取当前CPU的钟摆时间 double time0 = static_cast<double>(getTickCount()); /** * 迭代器处理 */ //起始位置的迭代器 // Vec3b是向量 Mat_<Vec3b>::iterator it = img.begin<Vec3b>(); //结束为止的迭代器 Mat_<Vec3b>::iterator itEnd = img.end<Vec3b>(); for (; it!= itEnd; ++it) { uchar temp = (uchar)((*it)[2]*0.299+(*it)[1]*0.587+(*it)[0]*0.114); (*it)[0] = temp; (*it)[1] = temp; (*it)[2] = temp; } //计算运行时间 time0 = ((double)getTickCount() - time0)/getTickFrequency(); __android_log_print(ANDROID_LOG_INFO,"JNI","%ld",time0); int size = w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, pixels); env->ReleaseIntArrayElements(pixels_,pixels,0); env->ReleaseIntArrayElements(pixels_, pixels, 0); return result; } }
方式三:动态地址计算。
extern "C" { JNIEXPORT jintArray JNICALL Java_com_xy_opencv_ndk_1opencv002_MainActivity_grayPixels(JNIEnv *env, jclass type, jintArray pixels_, jint w, jint h) { jint *pixels = env->GetIntArrayElements(pixels_, NULL); if (pixels == NULL) { return 0; } //图片一进来时是ARGB 通过mat转换BGRA Mat img(h, w, CV_8UC4, pixels); /** * 动态地址计算 * 得用Vec4b */ int row = img.rows; int col = img.cols; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { uchar temp = (uchar)(img.at<Vec4b>(i,j)[2]*0.299 +img.at<Vec4b>(i,j)[1]*0.587 +img.at<Vec4b>(i,j)[0]*0.114); img.at<Vec4b>(i,j)[0]=temp; img.at<Vec4b>(i,j)[1]=temp; img.at<Vec4b>(i,j)[2]=temp; } } //计算运行时间 time0 = ((double)getTickCount() - time0)/getTickFrequency(); __android_log_print(ANDROID_LOG_INFO,"JNI","%ld",time0); int size = w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, pixels); env->ReleaseIntArrayElements(pixels_,pixels,0); env->ReleaseIntArrayElements(pixels_, pixels, 0); return result; } }
这三种方式中,性能最好的是第一种,耗时少,第二种和第三种耗时差不多,但第二种使用了迭代器,可以保证不会越界,安全性高,第三种方式使用了Mat中的方法动态操作地址中的数据,便于理解。
相关文章推荐
- **ANDROID**# 第七章图形与图像处理(静态处理) > Bitmap是有像素点构成的点阵图。 ------ ## 使用简单的图片 ---- * 通过Drawable对象进行访问。
- Python-OpenCV 处理图像(三):图像像素点操作
- 在Android平台上利用opencv进行图像处理之边缘检测、灰度变换、缩小
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
- Python-OpenCV 处理图像(三):图像像素点操作
- 我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
- Android Jni OpenCV图片灰度处理
- Python-OpenCV 处理图像(二)(三):滤镜和图像运算 图像像素点操作
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
- Android图片高斯模糊处理应用-涉及libjpeg的使用,NDK对SurfaceView的操作,图像模糊处理,附源代码
- OpenCV 数组存储图片像素值,便于后期图像处理
- Python OpenCV处理图像之图像像素点操作
- Python-OpenCV 处理图像(三):图像像素点操作
- Opencv (Opencv2)结合MFC学习数字图像处理---图片解码(2)
- 常见图像处理库(fastVCV、openCV for Android)
- 灰度图像像素颜色亮度处理
- OPENCV用户手册之图像处理部分(之三):形态学操作(中文翻译)
- Opencv (Opencv2)结合MFC学习数字图像处理---图片解码(1)
- android 图片处理操作学习1 显示
- OPENCV用户手册之图像处理部分(之三):形态学操作(中文翻译)