提取單圖元輪廓

一. 應用場景!

使用過Genesis的朋友都知道,它可以提取你點擊單圖元中心<提取圖元輪廓計算中心點>!


二.

由于工作需要,去年在師傅的知道下寫了一個單圖元輪廓提取算法!


三. 原理

提取輪廓即需要找出單圖元最外(內)層連續不間斷的點!

故我們需要一個起始點,即從你點擊的單圖元出發,向左(←↑→↓, 4個方向皆可,只需改變算子的起始點)遍歷至第一個與點擊點不用色調的點,此點極為最外層輪廓的起始點,然后以你所選方向為算子起始項,進行順時針(逆時針)遍歷,直到遍歷點與起始點重合,說明輪廓提取完畢!


四.

本例中我采用向左順時針遍歷,剩余的7種就交給聰明的你了!


1)準備算子結構

123
0*4
765


typedef struct DOTS_ARR // 采用屏幕坐標,Y軸向下!
{
INT32 OffsetX; // 相對中心點X向的偏移量
INT32 OffsetY; // 相對中心點Y向的偏移量
INT32 NextDotIndex; // 此點為目標點,下次遍歷位置索引
}DOTS_ARR;

2)未優化算子

DOTS_ARR DotsArr[] =?
{
-1, ?0, 5,
-1, -1, 6,
0, -1, 7, // 上圖中當前計算點的正上方2號點,若此點為最新提取的輪廓點,則下一點應為此點相對位置7開始遍歷,原因如下:
1, -1, 0,
1, ?0, 1,
1, ?1, 2,
0, ?1, 3,
-1, ?1, 4,
};

為了保證不遺漏,我們必須采取順時針(逆時針)遍歷當前點周圍所有點(以上次遍歷成功2號點為例)

123
0(1)*(2)4(3)
7(0)6(*)5(4)

()括號中為以上以中心點為相對位置的坐標

看到上圖,聰明的朋友一定會說7不是最好的位置,1才是,應為0,7在上次的遍歷中已經被排除了(you are right)!


故最優算子如下

DOTS_ARR DotsArr[] =?
{

-1, ?0, 5,
-1, -1, 7,
0, -1, 1,
1, -1, 1,
1, ?0, 3,
1, ?1, 3,
0, ?1, 5,
-1, ?1, 5,
};


五. Demo
關鍵的算子已經序數完了,那么我用一個簡單的Demo來實踐一下!

1)先上一個提取后的效果圖

2)簡單的列幾處關鍵代碼:

1.創建一個簡單窗口類單獨用來繪制

?m_MyView.CreateEx(NULL, AfxRegisterWndClass(CS_HREDRAW,NULL,(HBRUSH)::GetStockObject(WHITE_BRUSH),NULL), L"CPaintView Window", WS_CHILD, m_MyViewRect, this, 0);
i
f (NULL == m_MyView)
{
TRACE(_T("Error:(%s.%d) CreateEx Failed!\r\n"), __FUNCTION__, __LINE__);
}
?


2.在窗口顯示之前,加載我們的位圖

if (bShow)// Show

{

m_hMemDC = CreateCompatibleDC(NULL);

HBITMAP hBitmap = LoadBitmapW(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_START));

BITMAP bmp;

GetObject(hBitmap, sizeof(BITMAP), &bmp);

m_BitmapSize.cx = bmp.bmWidth;

m_BitmapSize.cy = bmp.bmHeight;

m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, hBitmap);

}

else// Close

{

HBITMAP hBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hOldBitmap);

DeleteObject(m_hOldBitmap);

DeleteDC(m_hMemDC);

}

注意:一定要刪除GDI對象,做到萬浪叢中過,滴水不沾身,否則會造成GDI泄漏(進程中GDI對象達到9999個,此進程會奔潰)


3.在圖元上打擊做按鈕時,提取輪廓!

#pragma region Get Contour Centerm_VectorContourPoint.clear();CDC *lpCDC = GetDC();HDC hClientDC = lpCDC->GetSafeHdc();RECT ContourRect = {};POINT ptStart = {};POINT ptErgod = {point.x, point.y};COLORREF iColorValue = GetPixel(hClientDC, point.x, point.y);while (iColorValue == GetPixel(hClientDC, ptErgod.x , ptErgod.y)){ptErgod.x--;}if (-1 == ptErgod.x){return;}ptErgod.x++;memcpy(&ptStart, &ptErgod, sizeof(POINT));ContourRect.left = ptStart.x;ContourRect.right = ptStart.x;ContourRect.top = ptStart.y;ContourRect.bottom = ptStart.y;INT32 Count = 0;INT32 FlagIndex = 0;do {for (INT32 i = 0; i < DotsArrCount; i++){if (iColorValue == GetPixel(hClientDC, ptErgod.x + DotsArr[FlagIndex].OffsetX, ptErgod.y + DotsArr[FlagIndex].OffsetY)){Count++;ptErgod.x += DotsArr[FlagIndex].OffsetX;ptErgod.y += DotsArr[FlagIndex].OffsetY;FlagIndex = DotsArr[FlagIndex].NextDotIndex;m_VectorContourPoint.push_back(ptErgod);break;}FlagIndex++;if (FlagIndex == DotsArrCount){FlagIndex = 0;}}ContourRect.left   = (ptErgod.x < ContourRect.left)   ? ptErgod.x : ContourRect.left;ContourRect.right  = (ptErgod.x > ContourRect.right)  ? ptErgod.x : ContourRect.right;ContourRect.top    = (ptErgod.y < ContourRect.top)    ? ptErgod.y : ContourRect.top;ContourRect.bottom = (ptErgod.y > ContourRect.bottom) ? ptErgod.y : ContourRect.bottom;} while (ptStart.x != ptErgod.x || ptStart.y != ptErgod.y);TRACE("Count is %d\r\n", Count);m_ptCenter.x = (ContourRect.left + ContourRect.right) >> 1;m_ptCenter.y = (ContourRect.top + ContourRect.bottom) >> 1;ReleaseDC(lpCDC);Invalidate(TRUE);
#pragma endregion

4)簡單動態顯示我們提取成果

	BitBlt(dc.GetSafeHdc(), 0, 0, m_BitmapSize.cx, m_BitmapSize.cy, m_hMemDC, 0, 0, SRCCOPY);for (vector<POINT>::iterator itPoint = m_VectorContourPoint.begin(); itPoint != m_VectorContourPoint.end(); itPoint++){if (itPoint == m_VectorContourPoint.begin()){MoveToEx(dc.GetSafeHdc(), (*itPoint).x + m_BitmapSize.cx, (*itPoint).y, NULL);}else{Sleep(1);LineTo(dc.GetSafeHdc(), itPoint->x + m_BitmapSize.cx, itPoint->y);}}

5)完成,運行過程中截圖,運行完成即為之前貼出的預覽圖!

六.總結

師傅告訴我:圖像算法的處理要長期的積累,自己去悟,多思考,當遇到一個新的算法需求,結合自己的經驗積累,就能快速得到處理方法!

有興趣的朋友可以不使用Demo中Getpixel(),而是直接處理位圖數據塊,這樣輪廓提取的效率會更高!


這也是我去年學到第一個算法處理的,在這一年中,自己也積累了一些簡單的圖像處理算法:如灰度淡化(抽點),多圖元骨架提取等!


最后希望圖像處理大神不嗇指出demo中的不足以及需要優化之處,謝謝!


七)Demo源碼下載地址

http://download.csdn.net/detail/u012158162/9590647




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決: Failed to execute ... maven-deploy-plugin... Return code is: 401, ReasonPhrase: Unauthorized.

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行 mvn clean deploy , 想把本地代碼 打包并推送到私服 &#xff0c;報錯&#xff1a; [ERROR] Failed to execute goal org.a…

高速行車12條技巧,每一條都關乎你的生命

高速行車12條技巧&#xff0c;每一條都關乎你寶貴的生命。 1、長途旅行前&#xff0c;全面檢查整車&#xff0c;防止漏油&#xff0c;輪胎檢查是重點&#xff01; 在中國很多高速事故是可以避免的&#xff0c;絕大部分司機缺少本應該在駕校學到的必備知識&#xff0c;這導致很多…

文件逆序輸出及根據行號索取該行內容

一. 起因 年初&#xff0c;一位同學提取了如何實現倒敘輸出文件&#xff0c;根據行號索引該行內容&#xff0c;我思考了一下&#xff0c;得出以下二種方案&#xff01; 二. 方案 1&#xff09;方案1&#xff1a;&#xff08;此方案局限性較大&#xff0c;并且耗內存&#xff…

pom.xml 配置之:snapshot 快照庫和 release發布庫 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、如果在發布時使用 mvn deploy -P release 的命令&#xff0c;那么會自動使用0.1作為發布版本&#xff0c;那么根據 maven 處理 snaps…

米飯涼一涼再吃會更加地健康

米飯&#xff0c;是人們日常飲食中的主角之一;一味米飯&#xff0c;與五味調配&#xff0c;幾乎可以供給全身所需營養。大米性平、味甘;有補中益氣、健脾養胃、益精強志、和五臟、通血脈、聰耳明目、止煩、止渴、止瀉的功效。 人們往往認為米飯應該趁熱的時候吃。 但是用電飯煲…

內存映射處理大文件并實現逆序輸出

上一篇介紹了一種常見的文件處理方法(可優化為&#xff1a;分次讀取文件&#xff0c;但要滿足根據行號能快速索引該行內容時會遇到麻煩),所以此片我將介紹另一種更高效&#xff0c;實用&#xff0c;并對本進程的內存空間地址消耗小的方法&#xff01; 一. 預備知識 1&#xff…

解決: tar: Removing leading `/‘ from member names

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我的情況 。 使用絕對路徑 執行 tar 命令&#xff1a; tar -zcvf clientOne.tar /root/jiangyu/projects/springCloud/clientOne/s…

ObjectArx創建指定塊

ObjectArx創建自定義塊 一. 目的仿照AutoCad的Block命令&#xff0c;實現簡版創建塊功能!二. 開發環境Win7操作系統&#xff0c;AutoCad2012&#xff0c; VS2008, ObjectArx_SDK_2012三. 相關函數簡介1) int acedSSGet (const ACHAR *str, const void *pt1,const void *pt2…

告訴你中國著名的40個四大是什么?

中國著名的40個四大 一、四大江南才子&#xff1a;唐伯虎、文征明、祝枝山、徐禎卿&#xff1b; 二、四大才女&#xff1a;蔡文姬、班昭&#xff08;又說上官婉兒&#xff09;、卓文君、李清照&#xff1b; 三、四大名著&#xff1a;《三國演義》、《西游記》、《水滸傳》、《…

解決:Dockerfile 中執行 tar 命令始終報錯:tar: /xx/xx: Cannot stat: No such file or directory tar: Exiting with

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. docker 執行 build &#xff0c; dockerfile 中有一行命令&#xff1a; RUN tar -zcvP -f clientOne.tar /root/jiangyu/projects/…

ObjectArx創建自定義實體

ObjectArx創建自定義實體 一。目的在ObjectArx中已經有了許多實體&#xff0c;如AcDbLine,AcDbCircle,AcDbArc等&#xff0c;但在用戶使用Cad時&#xff0c;會有一些對他們來講常用的“實體“&#xff0c;如一扇門&#xff0c;如果我們能提供一個“門實體“&#xff0c;讓用戶能…

開車人千金難買的知識!(組圖)

開車的人千金難買的知識: 前言&#xff1a; 一、 發動機是怎樣被您自己開壞的 二、 變速箱是怎樣被您自己開壞的 三、 排水口&#xff08;很重要您肯定不知道的&#xff09; 四、 離合 五、 水箱 六、 方向助力 七、 空調 八、底盤 九、愛車是如何被自己撞壞的&#x…

如何在 IDEA 啟動多個 Spring Boot 工程實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一個工程啟動多個實例&#xff0c;分別占用不同的端口。 step 1 在IDEA上點擊Application右邊的下三角 ,彈出選項后&#xff0c;點擊Ed…

安裝micro/go-micro

創建文件夾&#xff0c;拉取相關包 mkdir golang.org cd golang.org mkdir x cd x git clone https://github.com/golang/net.git git clone https://github.com/golang/crypto.git git clone https://github.com/golang/sys.git git clone https://github.com/golang/…

剎車八個技巧 教你踩得又穩又好

駕車加速行駛&#xff0c;這是誰都可以做到的。但是如果我們不能夠正確地操作剎車&#xff0c;汽車有可能在一瞬間變成事故的兇器&#xff0c;因此&#xff0c;也許我們可以說剎車技術是駕駛汽車的境界之一。以下為大家列舉八種剎車技巧&#xff0c;如果全部掌握的話&#xff0…

springcloud 注解 @EnableDiscoveryClient 與 @EnableEurekaClient 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在使用 Spring Cloud feign 服務發現時提到兩種注解&#xff1a; EnableDiscoveryClient、EnableEurekaClient 。 spring cloud 中 disc…

開車路上怎樣趕走瞌睡蟲?網友支招如何防路困

春困秋乏&#xff0c;秋天時不時來個哈欠打個盹也是人之常情&#xff0c;可是如果您正在路上開車可就是危險之極的事情了&#xff01;要知道&#xff0c;這在路上開快車不是最危險的&#xff0c;最危險的是走神&#xff0c;而打瞌睡更是要命的&#xff01;可這打瞌睡是身體疲乏…

重啟 docker 服務、Docker 重啟

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我的情況 &#xff1a;重啟阿里云 ECS 服務器后&#xff0c;一切服務都停止了。 重啟 XXX 服務通用命令&#xff1a;service xxx re…

25歲肥胖!美研究:晚年恐出現病態肥胖

如果您現在剛好25歲&#xff0c;最好注意一下現在的體重&#xff0c;因為美國紐約大學最新研究發現&#xff0c;如果在25歲這個年齡&#xff0c;您的體重是超重的&#xff0c;10年后肥胖的機率會比較高&#xff0c;男生恐怕高到23.1%&#xff0c;女生高到46.9%&#xff0c;而年…

linux 查看 CPU 使用率

1&#xff1a;top 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 top -bn 1 -i -c top命令可以看到總體的系統運行狀態和cpu使用效率 %us: 表示用戶空間程序的cpu使用效率 %sy:表示…