生活随笔
收集整理的這篇文章主要介紹了
图像基本处理算法的简单实现(二)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?圖像基本處理算法的簡(jiǎn)單實(shí)現(xiàn)(一)
?圖像基本處理算法的簡(jiǎn)單實(shí)現(xiàn)(二)
?
4)膨脹腐蝕 屬于什么心態(tài)學(xué)==,膨脹、腐蝕、擊中/擊不中變換、細(xì)化…(又暈了T^T)。簡(jiǎn)單點(diǎn)好像就是集合運(yùn)算,圖像與一結(jié)構(gòu)元素的交差補(bǔ)什么的。圖像一點(diǎn)的周圍是否符合結(jié)構(gòu)元素,然后該怎么處理。 結(jié)構(gòu)元素(B)由0和1組成,用于掃描比較二值化圖像(A)。 膨脹: 1、用結(jié)構(gòu)元素B,掃描圖像A的每一個(gè)像素 2、用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作 3、如果都為0,結(jié)果圖像的該像素為0。否則為1 腐蝕: 1、用結(jié)構(gòu)元素B,掃描圖像A的每一個(gè)像素 2、用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作 3、如果都為1,結(jié)果圖像的該像素為1。否則為0 膨脹腐蝕是形態(tài)學(xué)處理的基礎(chǔ)。(copy的==) 膨脹的實(shí)現(xiàn):
???????????JNIEXPORT?jintArray?JNICALL?Java_org_join_image_util_JoinImage_dilation(?????????JNIEnv*?env,?jobject?obj,?jintArray?buf,?int?w,?int?h)?{?????LOGE("==dilation==");??????jint?*?cbuf;??????cbuf?=?(*env)->GetIntArrayElements(env,?buf,?0);???????int?white?=?0xFFFFFFFF;??????int?black?=?0xFF000000;???????int?size?=?w?*?h;?????jint?rbuf[size];??????memset(rbuf,?black,?size?*?sizeof(jint));???????int?i,?j,?m,?n,?gray;?????jint?*p,?*q;??????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????for?(j?=?1;?j?<?w?-?1;?j++)?{?????????????p?=?cbuf?+?w?*?i?+?j;????????????????????????????for?(m?=?-1;?m?<=?1;?m++)?{?????????????????for?(n?=?-1;?n?<=?1;?n++)?{?????????????????????gray?=?(*(p?+?w?*?m?+?n))?&?0xFF;???????????????????????????????????????????if?(gray?==?255)?{?????????????????????????q?=?rbuf?+?w?*?i?+?j;??????????????????????????*q?=?white;??????????????????????????break;?????????????????????}?????????????????}?????????????}?????????}?????}??????jintArray?result?=?(*env)->NewIntArray(env,?size);??????(*env)->SetIntArrayRegion(env,?result,?0,?size,?rbuf);??????(*env)->ReleaseIntArrayElements(env,?buf,?cbuf,?0);??????return?result;?}? 腐蝕的實(shí)現(xiàn):
???????????JNIEXPORT?jintArray?JNICALL?Java_org_join_image_util_JoinImage_erosion(?????????JNIEnv*?env,?jobject?obj,?jintArray?buf,?int?w,?int?h)?{?????LOGE("==erosion==");??????jint?*?cbuf;??????cbuf?=?(*env)->GetIntArrayElements(env,?buf,?0);???????int?white?=?0xFFFFFFFF;??????int?black?=?0xFF000000;???????int?size?=?w?*?h;?????jint?rbuf[size];??????memset(rbuf,?black,?size?*?sizeof(jint));???????int?i,?j,?m,?n,?gray;?????jint?*p,?*q;??????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????for?(j?=?1;?j?<?w?-?1;?j++)?{?????????????p?=?cbuf?+?w?*?i?+?j;???????????????q?=?rbuf?+?w?*?i?+?j;??????????????*q?=?white;????????????????????????????for?(m?=?-1;?m?<=?1;?m++)?{?????????????????for?(n?=?-1;?n?<=?1;?n++)?{?????????????????????gray?=?(*(p?+?w?*?m?+?n))?&?0xFF;???????????????????????????????????????????if?(gray?==?0)?{?????????????????????????*q?=?black;??????????????????????????break;?????????????????????}?????????????????}?????????????}?????????}?????}??????jintArray?result?=?(*env)->NewIntArray(env,?size);??????(*env)->SetIntArrayRegion(env,?result,?0,?size,?rbuf);??????(*env)->ReleaseIntArrayElements(env,?buf,?cbuf,?0);??????return?result;?}? 好吧,都一樣的結(jié)構(gòu)元素==,這是偷懶呢。沒(méi)必要非這樣,也可以如“背景色點(diǎn)上下左右>=3點(diǎn)為前景色,則將其填充為前景色”什么的。 5)細(xì)化 提取圖像骨架的。主要有Zhang快速并行細(xì)化方法、Hilditch、Pavlidis、Rosenfeld、索引表細(xì)化方法等。 簡(jiǎn)述下連通圖概念先:分為四連通和八連通(或者稱之為鄰域)。四連通就是圖像上下左右有一點(diǎn)時(shí),才算這兩點(diǎn)是連接的;而八連通則周圍一圈有一點(diǎn)都行。也就是一點(diǎn)只有右上角有鄰點(diǎn),則是八連通非四連通^^。 算法按著名字查找下就好==,不想再表述了(實(shí)現(xiàn)代碼注釋了其實(shí)有了的^^)。 Zhang快速并行細(xì)化方法:
???????????JNIEXPORT?jintArray?JNICALL?Java_org_join_image_util_JoinImage_thinning(?????????JNIEnv*?env,?jobject?obj,?jintArray?buf,?int?w,?int?h)?{?????LOGE("==thinning==");??????jint?*?cbuf;?????cbuf?=?(*env)->GetIntArrayElements(env,?buf,?0);???????int?black?=?0xFF000000;???????unsigned?char?foreground?=?0xFF;??????unsigned?char?background?=?0;???????jboolean?modified?=?1;??????unsigned?char?count;??????unsigned?char?mark[w][h];???????int?size?=?w?*?h;???????????????????int?i,?j,?m,?n;??????unsigned?char?gray;??????unsigned?char?grays[3][3];??????jint?*p;????????????while?(modified)?{?????????modified?=?0;???????????????????????????????memset(mark,?0,?sizeof(mark));????????????????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????????for?(j?=?1;?j?<?w?-?1;?j++)?{??????????????????p?=?cbuf?+?w?*?i?+?j;??????????????????gray?=?(*p)?&?0xFF;???????????????????if?(gray?==?foreground)?{????????????????????????????????????????????count?=?0;??????????????????????for?(m?=?-1;?m?<=?1;?m++)?{?????????????????????????for?(n?=?-1;?n?<=?1;?n++)?{?????????????????????????????gray?=?(*(p?+?w?*?m?+?n))?&?0xFF;??????????????????????????????grays[m?+?1][n?+?1]?=?gray;??????????????????????????????if?(gray?==?foreground)?{??????????????????????????????????count++;?????????????????????????????}?????????????????????????}?????????????????????}?????????????????????count--;????????????????????????????????????????????if?(2?<=?count?&&?count?<=?6)?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}????????????????????????????????????????????????????????????????count?=?0;??????????????????????if?(grays[0][1]?<?grays[0][2])?????????????????????????count++;??????????????????????if?(grays[0][2]?<?grays[1][2])?????????????????????????count++;??????????????????????if?(grays[1][2]?<?grays[2][2])?????????????????????????count++;??????????????????????if?(grays[2][2]?<?grays[2][1])?????????????????????????count++;??????????????????????if?(grays[2][1]?<?grays[2][0])?????????????????????????count++;??????????????????????if?(grays[2][0]?<?grays[1][0])?????????????????????????count++;??????????????????????if?(grays[1][0]?<?grays[0][0])?????????????????????????count++;??????????????????????if?(grays[0][0]?<?grays[0][1])?????????????????????????count++;????????????????????????????????????????????if?(1?==?count)?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}???????????????????????????????????????????if?(background?==?grays[0][1]?||?background?==?grays[1][2]?????????????????????????????||?background?==?grays[2][1])?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}???????????????????????????????????????????if?(background?==?grays[1][2]?||?background?==?grays[2][1]?????????????????????????????||?background?==?grays[1][0])?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}?????????????????????????????????????????????mark[j][i]?=?1;??????????????????????modified?=?1;??????????????????}?????????????}?????????}???????????????????if?(modified)?{?????????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????????????for?(j?=?1;?j?<?w?-?1;?j++)?{??????????????????????????????????????????if?(1?==?mark[j][i])?{?????????????????????????cbuf[w?*?i?+?j]?=?black;??????????????????????}?????????????????}?????????????}?????????}??????????????????????????memset(mark,?0,?sizeof(mark));????????????????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????????for?(j?=?1;?j?<?w?-?1;?j++)?{??????????????????p?=?cbuf?+?w?*?i?+?j;??????????????????gray?=?(*p)?&?0xFF;???????????????????if?(gray?==?foreground)?{????????????????????????????????????????????count?=?0;??????????????????????for?(m?=?-1;?m?<=?1;?m++)?{?????????????????????????for?(n?=?-1;?n?<=?1;?n++)?{?????????????????????????????gray?=?(*(p?+?w?*?m?+?n))?&?0xFF;??????????????????????????????grays[m?+?1][n?+?1]?=?gray;??????????????????????????????if?(gray?==?foreground)?{??????????????????????????????????count++;?????????????????????????????}?????????????????????????}?????????????????????}?????????????????????count--;????????????????????????????????????????????if?(2?<=?count?&&?count?<=?6)?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}????????????????????????????????????????????????????????????????count?=?0;??????????????????????if?(grays[0][1]?<?grays[0][2])?????????????????????????count++;??????????????????????if?(grays[0][2]?<?grays[1][2])?????????????????????????count++;??????????????????????if?(grays[1][2]?<?grays[2][2])?????????????????????????count++;??????????????????????if?(grays[2][2]?<?grays[2][1])?????????????????????????count++;??????????????????????if?(grays[2][1]?<?grays[2][0])?????????????????????????count++;??????????????????????if?(grays[2][0]?<?grays[1][0])?????????????????????????count++;??????????????????????if?(grays[1][0]?<?grays[0][0])?????????????????????????count++;??????????????????????if?(grays[0][0]?<?grays[0][1])?????????????????????????count++;????????????????????????????????????????????if?(1?==?count)?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}???????????????????????????????????????????if?(background?==?grays[0][1]?||?background?==?grays[1][2]?????????????????????????????||?background?==?grays[1][0])?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}???????????????????????????????????????????if?(background?==?grays[0][1]?||?background?==?grays[2][1]?????????????????????????????||?background?==?grays[1][0])?{?????????????????????}?else?{?????????????????????????continue;??????????????????????}?????????????????????????????????????????????mark[j][i]?=?1;??????????????????????modified?=?1;??????????????????}?????????????}?????????}???????????????????if?(modified)?{?????????????for?(i?=?1;?i?<?h?-?1;?i++)?{?????????????????for?(j?=?1;?j?<?w?-?1;?j++)?{??????????????????????????????????????????if?(1?==?mark[j][i])?{?????????????????????????cbuf[w?*?i?+?j]?=?black;??????????????????????}?????????????????}?????????????}?????????}?????}??????jintArray?result?=?(*env)->NewIntArray(env,?size);??????(*env)->SetIntArrayRegion(env,?result,?0,?size,?cbuf);??????(*env)->ReleaseIntArrayElements(env,?buf,?cbuf,?0);??????return?result;?}??
?圖像基本處理算法的簡(jiǎn)單實(shí)現(xiàn)(三)
? ? ?本文轉(zhuǎn)自winorlose2000 51CTO博客,原文鏈接:http://blog.51cto.com/vaero/823000,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的图像基本处理算法的简单实现(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。