당신은 주제를 찾고 있습니까 “영상 처리 라벨링 – 데이터 라벨링 부업이란? 3개월 재택근무 데이터 라벨러 프리랜서로 일한 찐 경험과 수익 공개“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 N잡러 로미TV 이(가) 작성한 기사에는 조회수 16,087회 및 좋아요 302개 개의 좋아요가 있습니다.
영상 처리 라벨링 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 데이터 라벨링 부업이란? 3개월 재택근무 데이터 라벨러 프리랜서로 일한 찐 경험과 수익 공개 – 영상 처리 라벨링 주제에 대한 세부정보를 참조하세요
데이터 라벨링을 처음 접하는 분들을 위해 데이터 라벨링 개념부터 설명드립니다. 데이터 라벨러로 어떻게 활동했는지 부터 수익까지 공개합니다!
데이터 라벨링에 대한 찐 경험을 담은 N잡러 로미의 이야기! 놓치지 마세요!
* 이런분들께 추천드립니다!
▶ 데이터 라벨링이 무엇인지 알고 싶은 분들
▶ 데이터 라벨링 찐!경험 후기가 궁금한 분들
▶ 데이터 라벨러 프리랜서로 활동하고 싶지만 어디서 찾아야 할지 모르는 분들
▶ 데이터 라벨링 부업(알바)로 수익을 낼 수 있을 지 궁금한 분들
*템플릿 출처 : 미리캔버스
*영상 프로그램 : 뱁믹스 \u0026 다빈치 리졸브
영상 처리 라벨링 주제에 대한 자세한 내용은 여기를 참조하세요.
영상처리(MFC) 8. 라벨링(Labeling) – 네이버 블로그
영상처리(MFC). 8. Labeling 라벨링 : neighborhood, GrassFire algorithm, 재귀 방식, 스택 방식. 라벨링, 혹은 레이블링 =_=;;. Labeling is just …
Source: m.blog.naver.com
Date Published: 3/16/2021
View: 369
[영상 처리] 파이썬으로 원하는 객체 라벨링하기
이때 영상처리 기법 라벨링(Labeling) 을 사용하면 위 내용들을 한번에 해결할 수 있다. 라벨링(Labeling)이란? 이미지 내에서 주위 같은 픽셀값들을 …
Source: mangchhe.github.io
Date Published: 2/14/2022
View: 9116
[c++ opencv] Labeling(라벨링, 레이블링)으로 객체 카운팅하는 …
본문 목표 영상처리를 하다보면 연속된 픽셀들이 이루는 그룹을 판단해야 할 상황이 있다. 이런 경우 대상에 이름을 붙여주는 작업이 라벨링 또는 …
Source: diyver.tistory.com
Date Published: 10/28/2022
View: 523
KR101328233B1 – 영상처리 시스템의 라벨링 장치 및 방법
영상처리 시스템의 라벨링 장치 및 방법이 개시된다. 본 발명에서는, 이진화 결과 소정 값을 가지는 영상에 대해, 픽셀의 1차원 좌표값으로 픽셀값을 초기화하고, …
Source: patents.google.com
Date Published: 12/19/2022
View: 9830
라벨링(Labeling)
이치화된 영상을 탐색하려다 밝기가 255인 화소값을 만나면 라벨링을 수행 … 또한 자기 호출은 프로그램이 내부적으로 처리하는 많은 명령들로 인해 …
Source: studyandroid.tistory.com
Date Published: 9/25/2021
View: 3303
[파이썬 OpenCV] 이진 영상 처리 – 레이블링 – 딥러닝 공부방
1. 레이블링 – Labeling … 레이블링은 객체 구역을 영역 단위로 분석하는 것입니다. … 일반적으로 이진 영상에서 수행합니다. 레이블링 속도가 외곽선 …
Source: deep-learning-study.tistory.com
Date Published: 8/6/2021
View: 6160
Connected component Labeling….영상 인식의 세번째
일지 10 : 이진(Binary)영상에서 레이블링하기… 영상 인식의 세번째. 사실 윤곽추출하기를 먼저 할려고 했는데…..책[영상처리프로그램 by Visual …
Source: blog.daum.net
Date Published: 3/26/2021
View: 2072
(재귀)Blob(Labeling) 알고리즘 – 잭팟53
… blob extraction, region labeling, blob discovery, or region extraction) )은 영상처리 분야에서 Labeling을 할 때 주로 쓰는 알고리즘인데, …
Source: jackpot53.tistory.com
Date Published: 1/4/2021
View: 5136
[Image Processing] Blob Algorithm (Connected component …
Blob Labeling 알고리즘은 영상처리 분야에서 Labeling을 할 때 주로 쓰는 방법으로서, 인접한 화소에 모두 같은 번호(Label)을 붙이고 연결되지 않은 …
Source: eehoeskrap.tistory.com
Date Published: 4/5/2021
View: 2195
주제와 관련된 이미지 영상 처리 라벨링
주제와 관련된 더 많은 사진을 참조하십시오 데이터 라벨링 부업이란? 3개월 재택근무 데이터 라벨러 프리랜서로 일한 찐 경험과 수익 공개. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 영상 처리 라벨링
- Author: N잡러 로미TV
- Views: 조회수 16,087회
- Likes: 좋아요 302개
- Date Published: 2022. 4. 14.
- Video Url link: https://www.youtube.com/watch?v=HMyGmXSO1FA
영상처리(MFC) 8. 라벨링(Labeling)
영상처리(MFC)
8. Labeling 라벨링 : neighborhood, GrassFire algorithm, 재귀 방식, 스택 방식
라벨링, 혹은 레이블링 =_=;;
Labeling is just giving a pixel a particular value .
For example, all pixels in the blue region have the label ’1′.
Pixels in the green region have the label ’2′.
The white region, or the background, has the label ’0′.
This, the problem is to ‘label’ connected regions in an image .
깔끔하고 간결한 요약문 발췌 ㅋㅋ 출처는 포스팅 아래 참고~
다시 말하자면 영상에서 각각의 물체를 찾아 특정한 값을 부여하는 것이다.
구글에서 찾아보면 라벨링 자료와 정보들이 정말 잘 정리되어 있음!!
라벨링을 할 때 고려할 부분은 크게 두 가지.
1.
인접하여 연결된 픽셀들을 찾는 것이므로 픽셀의 인접성(neighborhood)는 어떻게 할 것인가?
→ 4근방, 8근방
2.
연결된 픽셀들을 찾아 동일한 숫자로 마킹할 때의 알고리즘은?
→ (가장 많이 알려져 있는 것으로 보이는 게) Grass-fire 방식, Two-pass 방식
→ 재귀(자기 호출) 사용, stack 사용
어떤 픽셀 인접성을 사용하느냐에 따라 추출되는 물체가 달라질 수 있다.
(4방향은 상하좌우만 찾지만, 8방향은 대각선 픽셀까지 고려하기 때문)
아래는 실제 구현 결과.
(상, 좌) 원본 이진화 영상
(상, 우) 컬러로 라벨링
(하, 좌) 물체마다 명도값을 전부 다르게 하여 라벨링
(하, 우) 라벨링 값들은 (하, 좌)와 같으나 좀더 잘보이게 하기 위해 배경을 그래디언트로 함.
이하 동일.
▲ 8방향, 재귀 방식
▲ 4방향, 재귀 방식
▲ 8방향, 스택 이용
수행 시간이 어느 게 더 빠르고 느린지 알아보라고도 하셨는데,
마음 같아선 출력 화면에 텍스트도 띄우고 싶지만
이미 히스토그램 할 때 threshold value 를 표시하려고 끙끙대다가 잘 안 되어서 ㅜㅜ 모르겠다.
위 자료는 발표용으로 만든 PPT이며,
설명에 쓰인 자료들은 대부분 구글에서 읽어보고 도움될 만한 것들로 가져옴.
위 reference가 공부한 내용들 출처예요. 자세한 설명을 읽어보시는 게 도움이 많이 될 듯.
ⓒ 정아.
[영상 처리] 파이썬으로 원하는 객체 라벨링하기
import cv2 import numpy as np src = cv2 . imread ( ‘map_2.jpg’ ) # 소스 추가(응용) lower_green = ( 79 , 209 , 146 ) upper_green = ( 79 , 209 , 146 ) hsv = cv2 . inRange ( src , lower_green , upper_green ) hsv_dilate = cv2 . dilate ( hsv , np . ones (( 3 , 3 ), np . uint8 ), iterations = 3 ) cnt , labels , stats , centroids = cv2 . connectedComponentsWithStats ( hsv_dilate ) dst = cv2 . cvtColor ( hsv_dilate , cv2 . COLOR_GRAY2BGR ) for i in range ( 1 , cnt ): ( x , y , w , h , area ) = stats [ i ] cv2 . putText ( dst , str ( i ), ( x + w // 2 – 5 , y + h // 2 + 5 ), cv2 . FONT_HERSHEY_PLAIN , 1 , ( 0 , 0 , 255 ), 1 , cv2 . LINE_AA ) cv2 . rectangle ( dst , ( x , y , w , h ), ( 0 , 0 , 255 )) cv2 . imshow ( ‘src’ , src ) cv2 . imshow ( ‘hsv’ , hsv ) cv2 . imshow ( ‘hsv_dilate’ , hsv_dilate ) cv2 . imshow ( ‘dst’ , dst ) cv2 . waitKey ( 0 )
[c++ opencv] Labeling(라벨링, 레이블링)으로 객체 카운팅하는 방법
본문 목표
영상처리를 하다보면 연속된 픽셀들이 이루는 그룹을 판단해야 할 상황이 있다.
이런 경우 대상에 이름을 붙여주는 작업이 라벨링 또는 레이블링이라 한다.
(라벨링은 한국식 콩글리쉬인듯, 영문권에서는 레이블링 이라고 한다.)
Opnecv를 사용하지 않고도 레이블링을 할 수 있지만, 원리를 알아보고 그 사용법을 알아보도록 한다.
키워드 : 라벨링, 레이블링, labeling, connectedComponents(), connectedComponentsWithStats()
레이블링( labeling ) 이란?
인접한 같은 값을 갖는 픽셀끼리 하나의 그룹으로 묶어주는 작업이다.
쉽게 말해서 이진화 이미지에서 경계를 이룬 영역에 이름(숫자)을 부여하는 작업이다.
왜 레이블링이 필요한가?
영상인식 과 영상처리에서 가장 중요한 것은 노이즈를 없애는 것이다.
노이즈는 내가 찾고자 하는 대상을 제외한 모든것이 노이즈인 것이다.
예를 들어서 자율주행 시스템에 사용할 차선 검출 알고리즘을 개발했는데,
여러 차선이 동시에 보이는 경우 우회전 구간에서 직진으로 인식할 수 있다.
이 상황에서 레이블링을 적용하면, 내가 검출한 차선의 정보가 같은 객체에서 나온 것인지 판단하므로 오작동을 차단할 수 있다.
또 다른 상황으로 보면, 객체를 묶어주므로 RoI(Region of Interest, 관심영역)를 효과적으로 잡아줄 수 있는 것이다.
고정된 영역에서 RoI 를 사용하는 것이 아니라, 움직이는 상황에서 RoI 역시 대상을 따라가며 잡아주어 빠른 연산시간과 정확도를 사용자에게 선사해준다.
레이블링의 원리는 이미지에서 픽셀들의 연속성을 따지는 것에서 시작한다.
Image Topology 분야이다.
이전 강의들을 봤다면 연속의 방향성을 기억해내어야 한다.
4-neighbors 와 8-neighbors 가 있다.
다시 한번 짚고 넘어 가보자.
위의 사진 자료에서 보면 알겠지만, 4방향성은 중심 p에서 상하좌우만 연속성을 따진다.
8방향성은 중심 p에서 대각방향까지 연속성을 따지는 것이다.
연속성을 살펴봤으므로, 이제 살펴봐야하는 것은 방향성이다.
이미지의 픽셀 하나하나마다 조사를 해야하기 때문에, 언제나 동일한 규칙을 가지고 모든 픽셀에 적용해야 한다.
보통은 좌에서 우로, 위에서 아래 방향으로 조사를 시작한다.
이제 자료를 보면서 이해를 해보자.
4-방향성을 조사해볼 것이다.
위와 같은 이미지가 있다고 하자.
제일 위의 행에서 왼쪽부터 조사가 들어간다.
제일 처음 만난 픽셀 데이터에 숫자 1을 부여한다.
1행에는 데이터가 한 개만 있으므로 2행으로 넘어간다.
2행의 1열에 데이터가 존재한다.
2행 1열의 데이터를 기준으로 방향성을 조사해본다.
위에 픽셀(1행 1열)은 비어있고, 왼쪽 픽셀(2행 0열)은 존재하지 않는다.
따라서 새로운 값인 2를 부여해준다.
그리고 그 다음 열로 중심 픽셀을 설정한다.
2행 2열 에도 데이터가 존재한다.
이름을 붙이기 전에 인접 픽셀을 방향 원칙에 맞게 조사해야한다.
일단 위에서 아래 원칙이기에, 바로 위의 픽셀인 1행 2열 데이터를 조사한다.
이미 이름을 붙였던 1을 확인했다.
여기서 끝이 아니라, 왼쪽 픽셀인 2행 1열 데이터도 조사한다.
이번에도 이름을 붙였던 2를 확인했다.
이런 경우 낮은 넘버를 사용하는데, 1로 이름을 붙이던 2를 붙이던 딱히 상관은 없다.
왜냐하면 이 과정에서 우리는 1과 2를 동일하게 취급해야 하기 때문이다.
나중에 데이터 값이 2라면 모두 1로 바꿔줄 것이다.
여기까지 하고 계속 또 오른쪽으로 중심 픽셀 위치를 이동시켜본다.
2행 4열에 또 데이터가 존재하므로, 주변 픽셀 조사를 시작한다.
다행히도 위와 왼쪽 픽셀에 데이터가 존재하지 않으므로, 새로운 넘버 3을 부여한다.
이과정으로 3행도 조사를 시작한다.
3행을 조사해본 결과 3행 3열에 데이터가 존재하고,
위와 왼쪽에 데이터가 없으므로 새로운 넘버 4를 부여해준다.
3행 4열에도 데이터가 존재하면서 인접 픽셀에 데이터가 존재하므로 낮은 값인 3을 부여해준다.
이 과정에서 이미 3과 4는 같은 객체라고 판단을 해줘야한다.
이 과정으로 4행도 조사를 시작한다.
조사를 마치고보니 위와같은 데이터 맵이 생성되었다.
이 데이터를 한번 더 가공해야하는데, 1번과 2번이 같고, 3번과 4번, 5번이 같으므로 다시 이름을 부여해준다.
그러면 위와같은 최종 레이블링 맵이 생성된다.
4 방향성을 따져서 조사했으므로 위의 데이터에서는 분리된 객체가 2개 존재한다는 것을 알 수 있다.
8방향성 역시 마찬가지이다.
다만 방향성에서 추가해야하는 것이 있다.
바로 좌상단과 우상단 픽셀을 추가적으로 조사해야 한다는 것이다.
사실 이 과정을 코드로 직접 구현해도 금방 구현할 수 있을 것이다.
이중 반복문을 이용해서 이미지의 모든 픽셀에 대해서 조사를 하면 되는 것이라
처음 규칙만 잘 잡아준다면 조건문을 간단 명료하게 쓸 수 있을 것이고,
그것이 이 알고리즘의 전부인 것이다.
코드를 못 짜는데 쉽게 사용하고 싶은 분들에게는 다행히도 OpenCV에서 기본함수로 제공해주고 있으므로,
굳이 힘들게 코드를 짜지 않고도 이 원리를 이용할 수 있다.
이제부터 그 함수를 알아보도록 하자.
알아볼 함수 원형
– 레이블링 ( connectedComponentsWithStats )
Mat img = imread(“bacteria.tif”); Mat img_gray; cvtColor(img, img_gray, COLOR_BGR2GRAY); Mat img_threshold; threshold(img_gray, img_threshold, 100, 255, THRESH_BINARY_INV); Mat img_labels, stats, centroids; int numOfLables = connectedComponentsWithStats(img_threshold, img_labels, stats, centroids, 8, CV_32S);
connectedComponentsWithStats( src, labelimg_img, stats, centroid, connected_type, CV_32S )
○ src : 라벨링 할 원본 이미지(이진화 이미지 입력해야함, Object가 흰색이어야 함
○ labeling_img : 라벨링이 결과 데이터가 저장될 이미지
○ stats : 객체의 정보가 저장됨, 5열의 행렬
1열에는 객체를 사각형으로 봤을 때, 좌상단 끝의 x좌표가 저장됨
2열에는 객체를 사각형으로 봤을 때, 좌상단 끝의 y좌표가 저장됨
3열에는 객체를 사각형으로 봤을 때, 너비를 저장함(가로크기)
4열에는 객체를 사각형으로 봤을 때, 높이를 저장함(세로크기)
5열에는 객체를 사각형으로 봤을 때, 면적을 저장함(총 픽셀 수)
○ centroid : 객체의 중심 정보가 저장됨, 2열의 행렬
1열에는 객체의 중심좌표의 x좌표가 저장됨
2열에는 객체의 중심좌표의 y좌표가 저장됨
○ connected_type : 픽셀의 인접 방향성을 설정
– 4 connected : 상하좌우만 인접할 경우 연결처리 함, 4
– 8 connected : 대각방향으로 인접할 경우 연결처리 함, 8
코드 테스트 결과
– CODE
#include
#include using namespace cv; using namespace std; int main(int ac, char** av) { Mat img = imread(“bacteria.tif”); Mat img_resize; resize(img, img_resize, Size(img.cols * 3, img.rows * 3)); Mat img_gray; cvtColor(img_resize, img_gray, COLOR_BGR2GRAY); Mat img_threshold; threshold(img_gray, img_threshold, 100, 255, THRESH_BINARY_INV); Mat img_labels, stats, centroids; int numOfLables = connectedComponentsWithStats(img_threshold, img_labels, stats, centroids, 8, CV_32S); // 레이블링 결과에 사각형 그리고, 넘버 표시하기 for (int j = 1; j < numOfLables; j++) { int area = stats.at (j, CC_STAT_AREA); int left = stats.at (j, CC_STAT_LEFT); int top = stats.at (j, CC_STAT_TOP); int width = stats.at (j, CC_STAT_WIDTH); int height = stats.at (j, CC_STAT_HEIGHT); rectangle(img_resize, Point(left, top), Point(left + width, top + height), Scalar(0, 0, 255), 1); putText(img_resize, to_string(j), Point(left + 20, top + 20),FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 0, 0),1); } imshow(“img_resize”, img_resize); cout << "numOfLables : " << numOfLables - 1 << endl; // 최종 넘버링에서 1을 빼줘야 함 waitKey(0); return 0; } - RESULT 이미지 테두리에 제로패딩이 되어 있어서 완벽한 결과는 아니지만, 어찌되었든 라벨링이 제대로 된 것을 확인할 수 있다. 직접 개수를 세어봐도 21개가 나오는데, 사람이 세는 것보다 몇배는 더 빠르게 세어주니 이렇게 좋을 수가 없다. 똑같은 사진을 이용하고 싶다면 아래 파일을 이용하면 된다. 위에서 조금 수정을 한다면 erode 기법을 사용해주면 맨위의 박테리아에 제대로된 라벨이 붙지않을까 싶다. bacteria.tif 0.03MB 그리고 코드에서 보면 connectedComponentsWithStats( ) 함수의 값이 레이블링 넘버를 나타내는데, 실제 객체수보다 1이 크므로 카운팅이 중요하다면 결과값에서 1을 빼고 사용해야 한다. 도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~! 감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^
KR101328233B1 – 영상처리 시스템의 라벨링 장치 및 방법 – Google Patents
KR101030430B1 ( ko ) 2011-04-20 영상 처리 장치와 방법 및 그 기록매체
US9219841B2 ( en ) 2015-12-22 Image-processing device identifying object in image specified by encircling line
US20100158375A1 ( en ) 2010-06-24 Signal processing apparatus, signal processing method, computer-readable medium and computer data signal
WO2015002719A1 ( en ) 2015-01-08 Method of improving contrast for text extraction and recognition applications
US8774524B2 ( en ) 2014-07-08 Image processing apparatus, image processing method, and storage medium of image processing method
KR101328233B1 ( ko ) 2013-11-14 영상처리 시스템의 라벨링 장치 및 방법
US9031324B2 ( en ) 2015-05-12 Image-processing device specifying encircling line for identifying sub-region of image
라벨링(Labeling)
<라벨링>
라벨링이 필요한 이유
물체분할
라벨링 순서 / 라벨링 단계
라벨링이란?
라벨링 방법(Glassfire, 반복문)
라벨링이 필요한 이유!
가정용 로봇 : 주변 환경을 인식 하기위함
물체분할
분할은 배경(background)에서 물체(object)를 추출하는 것 을 뜻한다.
음성인식에서 특별한 소리만을 인식하는 것도 분할에 해당한다.
영상에서 관심 있는 영역(semantic region)은 물체가 되고 나머지는 배경으로 취급된다.
차안에서 사람의 목소리는 물체이고 차 소리나 바람소리는 배경 또는 잡음(noise)으로 된다.
라벨링 순서 / 단계
라벨링 순서
입력영상 -> 이치화 -> 이치화 영상->연결분석->라벨링영상->특징추출->영상특징들
라벨링단계
이치화된 영상을 탐색하려다 밝기가 255인 화소값을 만나면 라벨링을 수행하고 이 라벨링 점을 4-근방 또는 8근방의 중심으로 이동 후 다시 인접화소의 미방문 255화소값을 라벨링하는 방식으로 반복한다.
라벨링이란?
“인접하여 연결”되어 있는 모든 화소에 동일한 번호(라벨)를 붙이고 다른 연결 성분에는 또 다른 번호를 붙이는 작업
라벨링된 영상에서 임의의 번호를 가진 영역만 추출하면 영역 분리가 이루어지게 되며 특별한 영역에 대해서만 크기, 중심좌표, 원주길이 등을 추출해 내는 것이 가능하게 된다.
라벨링방법
Glassfire 알고리즘
마른잔디(glass)에서 불(fire)이 번져나가는 모양과 비슷하게 화소를 라벨링하기 때문에 붙여진 이름이다. 자기호출을 이용하여 모든 인접요소가 라벨링될 때까지 현재 관심화소의 주변 인접화소를 차례로 검사하면서 라벨링하는 방법
문제점 : Glassfire 방법은 자기호출을 사용하기 때문에 glass 함수가 자기 자신을 반복해서 호출한다. 과도한 자기호출은 시스템 스택을 넘치게 하기 때문에 너무 큰 크기의 물체영역을 라벨링하기에는 적당하지 않다. 또한 자기 호출은 프로그램이 내부적으로 처리하는 많은 명령들로 인해 속도가 저하되는 단점이 있다.
cv2.connectedComponentsWithStats
반응형
황선규 박사님의 ‘OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝’ 을 공부하면서 정리해 보았습니다.
예제 코드 출처 : 황선규 박사님 github홈페이지
이전 포스팅에서는 영상의 모폴로지 – 열기와 닫기에 대해 공부해보았습니다.
이번에는 객체 단위 분석에 이용되는 레이블링에 대해 공부하겠습니다.
객체 단위 분석
객체 단위 분석은 객체를 분할하여 특징을 분석하는 것을 의미합니다.
영상이 입력되었을 때 객체와 배경이 분리될 수 있다고 가정하며 이진화를 통해 객체와 배경을 분리합니다.
각각의 객체의 모양과 크기를 분석해서 내가 원하는 객체가 어디에 이쓰지 확인하고 싶을 때 객체단위 분석이 필요합니다.
객체 위치 및 크기 정보, ROI 추출, 모양 분석 등을 할 수 있습니다.
객체 단위 분석 방법은 레이블링과 외곽선 검출이 있습니다.
1. 레이블링 – Labeling
레이블링은 객체 구역을 영역 단위로 분석하는 것입니다.
서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정하는 작업입니다.(레이블맵)
일반적으로 이진 영상에서 수행합니다.
레이블링 속도가 외곽선 검출보다 빨라서 더 효율적입니다.
레이블링을 하기 위해서는 연결성을 정의해야 합니다.
(1) 4-이웃 연결 관계(4-neighbor connectivity)
4-이웃 연결 관계는 어떤 객체가 연결되어 있을 때 두 개 픽셀이 상하좌우 관계로 연결되었을 때를 의미합니다.
4-이웃 연결 관계
(2) 8-이웃 연결 관계(8-neighbor connectivity)
8-이웃 연결 관계는 상하좌우에 대각선도 포함하여 연결되어 있을 때를 의미합니다.
OpenCV는 보통 8-이웃 연결 관계를 사용합니다.
8-이웃 연결 관계
2. 레이블링 알고리즘의 입력과 출력
0은 배경 1이상은 객체로 판단합니다.
객체들이 서로 연결되어 있으면 같은 번호를 지정합니다.
같은 객체에 번호가 지정된 것을 레이블 맵이라고 합니다.
레이블 맵은 정수형 행렬입니다.
3. 레이블링 함수 – cv2.connectedComponents
레이블링 함수를 이용하여 레이블맵을 생성할 수 있습니다.
cv2.connectedComponents(image, labels=None, connectivity=None, ltype=None) -> retval, labels
• image: 8비트 1채널 영상
• labels: 레이블 맵 행렬. 입력 영상과 같은 크기. numpy.ndarray.
• connectivity: 4 또는 8. 기본값은 8.
• ltype: labels 타입. cv2.CV_32S 또는 cv2.CV_16S. 기본값은 cv2.CV_32S.
• retval: 객체 개수. N을 반환하면 [0, N-1]의 레이블이 존재 하며, 0은 배경을 의미. (실제 흰색 객체 개수는 N-1개)
출력값이 두개 있습니다.
retval은 객체 갯수 + 1 (배경 포함)을 반환하고
labels는 레이블맵 행렬을 반환합니다.
4. 객체 정보를 함께 반환하는 레이블링 함수 – cv2.connectedComponentsWithStats
이 함수를 많이 이용합니다.
객체의 크기와 중심위치도 함께 반환합니다.
cv2.connectedComponentsWithStats(image, labels=None, stats=None, centroids=None, connectivity=None, ltype=None) -> retval, labels, stats, centroids
• image: 8비트 1채널 영상
• labels: 레이블 맵 행렬. 입력 영상과 같은 크기. numpy.ndarray.
• stats: 각 객체의 바운딩 박스, 픽셀 개수 정보를 담은 행렬. numpy.ndarray. shape=(N, 5), dtype=numpy.int32.
• centroids: 각 객체의 무게 중심 위치 정보를 담은 행렬 numpy.ndarray. shape=(N, 2), dtype=numpy.float64.
• ltype: labels 행렬 타입. cv2.CV_32S 또는 cv2.CV_16S. 기본값은 cv2.CV_32S
반환값으로 retval, labels, stats, centroids 를 반환합니다.
retval : 객체 수 + 1 (배경 포함)
labels : 객체에 번호가 지정된 레이블 맵
stats : N행 5열, N은 객체 수 + 1이며 각각의 행은 번호가 지정된 객체를 의미, 5열에는 x, y, width, height, area 순으로 정보가 담겨 있습니다. x,y 는 좌측 상단 좌표를 의미하며 area는 면적, 픽셀의 수를 의미합니다.
centroids : N행 2열, 2열에는 x,y 무게 중심 좌표가 입력되어 있습니다. 무게 중심 좌표는 픽셀의 x 좌표를 다 더해서 갯수로 나눈 값입니다. y좌표도 동일합니다.
5. 키보드 영상에서 문자 영역 분할 예제
예제 코드는 황선규 박사님의 깃허브를 참고했습니다. sunkyoo.github.io/opencv4cvml/
src = cv2.imread(‘keyboard.bmp’, cv2.IMREAD_GRAYSCALE) if src is None: print(‘Image load failed!’) sys.exit() _, src_bin = cv2.threshold(src, 0, 255, cv2.THRESH_OTSU) cnt, labels, stats, centroids = cv2.connectedComponentsWithStats(src_bin) dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR) for i in range(1, cnt): # 각각의 객체 정보에 들어가기 위해 반복문. 범위를 1부터 시작한 이유는 배경을 제외 (x, y, w, h, area) = stats[i] # 노이즈 제거 if area < 20: continue cv2.rectangle(dst, (x, y, w, h), (0, 255, 255)) cv2.imshow('src', src) cv2.imshow('src_bin', src_bin) cv2.imshow('dst', dst) cv2.waitKey() cv2.destroyAllWindows() 반응형
프로젝트 수행 일지 : 초보 탈출기
일지 10 : 이진(Binary)영상에서 레이블링하기…
영상 인식의 세번째
사실 윤곽추출하기를 먼저 할려고 했는데…..책[영상처리프로그램 by Visual C++ ]의 순서를 따르다 보니….
일지9와 일지10 그리고 예정인 일지11은 모두 영상분할과 관련된 내용입니다. 위의 책 13장의 내용입니다.
이번 포스트는 http://en.wikipedia.org/wiki/Connected-component_labeling 위키의 내용을 그 기본으로 하고 코드는 책 [영상처리프로그램]을 참고하여 작성하였습니다. 또한 책[C언어로 배우는 실천영상처리]의 제7장의 내용을 참고했습니다.
10.1 Overview
이번 프로그램의 목적은 이미지안에 연결되어 있는 객체가 몇개인지 알아 내는 겁니다. 그리고 연결된 각 객체는 각각 고유한 번호 즉 라벨을 부여하는 거죠.
예를 들어….
옆의 그림과 같은 이진영상이 있을때 연결된 객체는 3개가 있게되죠. 그럼 각 객체에 번호를 각각 1,2,3이라고 붙여서 구별할 수 있고….그렇다면 영역을 분리하는 것과 마찬가지겠죠.
이번에 연습한 것이.. 바로 이러한 이진영상에서 객체(흰색의 배경이 아닌….여기서는 검정 픽셀)가 존재할 때 몇개의 객체가 존재하는지와 각 객체에 번호를 매기는 겁니다.
그렇다면 연결된 객체란…. 어떻게 정의해야 할까요.
보통 중심 픽셀에 대해서 4연결과 8연결을 말하는데요. 여기서는 4연결을 기준으로 해서 합니다. 즉 대각선은 연결된 것으로 보지 않는 겁니다. 바둑처럼 말이죠.
4연결……
즉 옆의 그림처럼…..가운데 중심 픽셀에 대해서 상하좌우픽셀만 연결되었다고 가정하는 겁니다….
10.2 알고리즘
연결요소라벨링(connected component labeling)는 크게 두가지 알고리즘이 존재한다고 합니다. 하나는 재귀알고리즘이고 나머지 하나는 반복입니다. 여기서는 이해하기 쉬운 반복 알고리즘을 하도록 하겠습니다.
반복 알고리즘은 이미지는 두번 스캔하게 됩니다. 방향은 위에서 아래로 그리고 왼쪽에서 오른쪽으로 합니다.
첫번쩨 스캔에서는 객체에 라벨을 부여하고 라벨에 대응하는 등가표(eqivalent table)를 작성합니다. 그리고 두번째 스캔에서는 등가표를 적당히 조정하고(resolve) 이에 맞추어서 이미지의 객체에 부여하는 라벨 번호도 조정합니다.
일단 코드 작성을 하기 전에 대략의 순서를 말로 표현하면 이렇습니다.
먼저 첫번째 스캔을 진행하다가
1. 배경이 아닌 픽셀을 만나면….주위의 연결 픽셀 중 바로 위 픽셀과 왼쪽 픽셀을 검사합니다. 만약 라벨이 되어 있는 픽셀이 없다면 새로이 라벨을 부여합니다.
등가표에 새로이 번호를 추가합니다.
2. 이어서 계속 스캔하다가 역시 객체픽셀을 만났는데 이번에는 위 픽셀 혹은 왼쪽 픽셀에 라벨이 부여되어 있습니다.
만약 위 픽셀이나 왼쪽 픽셀이 동시에 라벨이 부여되어 있지 않고
한군에만 라벨이 부여되어 있다면 이번에 만난 픽셀에 그 라벨을 부여합니다.
등가표는 조정할 필요는 없습니다.
그런데….둘다 라벨이 있다면……
이 경우에…..둘의 라벨이 같은 번호이면 이번에 만난 픽셀에도 같은 번호를 부여합니다.
그런데….주위 픽셀의 라벨이 다른 번호이면 가장 낮은 라벨을 이번에 만난 픽셀에 부여하고
등가표를 조정해줍니다.
3. 모든 픽셀을 검사할때까지 반복합니다.
그 결과 객체픽셀에 라벨이 부여되어 있고 등가표는 작성되어 있습니다.
두번째 스캔을 할때는…..
첫번째 스캔의 결과….생성된 등가표를 조정하고 이에 맟추어서 객체픽셀에 라벨을 조정합니다.
말로 하려니 어렵게 보이는…..그럼 실제로 하나하나 해보도록 하죠. 위의 이진영상을 예로 들어 설명하면….
음….위의 이진 영상도 설명하기에는 조금 복잡하네요…아주 간단한 영상으로 합니다.
문자인식일지10그림2.png
옆의 그림으로 하죠.
그럼….첫번째 스캔을 할까요…..
드디어 7번 픽셀이 타겟픽셀이네요….배경이 아니죠.
바로 옆(즉 6번)과 위의 픽셀(즉 3번)을 검사하니 모두 라벨링이 되어 있지 않습니다. 그럼 7번 픽셀에 라벨을 부여합니다. 첫 라벨이므로 1을 부여합니다. 그리고 등가표에도 적어줍니다.
그 다음으로 8번은 건너띄고 9번 픽셀을 검사합니다. 여기서 8번을 건너띄는 이유는….왼쪽옆 픽셀을 검사해야 하는데 없으므로 에러가 되죠 그래서 0번, 4번, 8번, 12번 픽셀은 검사하지 않습니다. 같은 이유로 0번, 1번, 2번, 3번 픽셀도 검사하지 않습니다. 이경우는 바로 위 픽셀이 없기 때문입니다.
9번 픽셀은 배경픽셀이 아니죠. 그럼 연결픽셀중 8번과 5번 픽셀을 검사합니다. 라벨이 되어 있지 않습니다. 그럼 9번 픽셀에 2번 라벨을 붙이고 등가표에도 적어둡니다.
10번은 배경이므로 넘어가고….
11번 픽셀은 객체픽셀이므로 왼쪽 옆과 바로 위 픽셀을 검사하죠. 라벨링이 되어 있는지를…..
바로 위쪽 픽셀에 1이라고 라벨링 되어 있으므로 11번 픽셀에도 같은 번호를 붙여줍니다. 등가표는 손 댈 것이 없죠.
12번 픽셀은 건너띄고…
13번 픽셀을 검사하죠. 바로 위 픽셀 즉 9번 픽셀에 2번이라고 라벨링 되어 있으므로 13번 픽셀에도 2번이라고 라벨링합니다.
역시나 등가표는 손댈 것이 없죠.
14번 픽셀 차례입니다.
14번의 경우 바로 옆 픽셀 즉 13번 픽셀이 라벨링되어 있으므로 이에 따라 같은 라벨을 붙여 줍니다. 2번을 붙이죠.
자 이제 마지막 픽셀입니다.
15번 픽셀의 경우 바로 위 픽셀(11번)과 왼쪽 픽셀(14번)에 이미 라벨링이 되어 있습니다.
그런데 두 라벨링의 값이 다르죠.
이때는 두 라벨 값중 작은값을 15번 픽셀의 라벨로 결정합니다.
그리고 1번 라벨과 2번 라벨을 적어둔 등가표도 조정해주어야 하는데요. 2벌 라벨이 바로 1번 라벨과 같기 때문입니다.
첫 번째 스캔이 끝났네요…..
보시면….라벨이 되어 있는데….연결픽셀이 1과 2로 번호가 붙여져 있고 등가표를 보니 2번이 1번과 같다고(등가,eqivalent)하다고 하네요.
이제 할 일은 이미지상에 1번과 2번이 라벨링되어 있는데……등가표를 이용하여 2번 라벨을 1번 라벨로 바꾸어 주어야 합니다. 이것은 두번째 스캔에서 수행합니다. 수행 결과는…… 10.3 코딩
그럼…..코드를 보도록 하죠.
비베넷에서 픽셀의 정보를 가지고 있는 배열인 pixels()는 1차원 배열입니다. 그런데 스캔할때는 위의 그림과 같이 2차원으로 전환하여 하는 것이 이해가 쉽죠. 물론 1차원을 2차원으로 바꾸는 것이 아니라….적당히 인덱스를 i와 j를 사용하여 변환하여 주는 겁니다.
이것이 바로 코드에서 pix_number의 기능입니다.
디자인을 약간 변경합니다. Histogram 창에서 버튼과 텍스트버튼을 하나 생성하죠.
그리고 라벨링 결과를 더블클릭하여 이벤트핸들러를 호출하여 다음과 같이 코딩하죠…
이번에는 LabelingClass클래스에서 함수를 shared로 선언하지 않고 일반 public으로 선언했습니다. 그렇니까 ….
클래스에 대해서 인스턴스를 만든후 사용해야 합니다.
위의 코딩에서 보는 것처럼….라벨링 결과는 따로 폼을 하나 생성해서 거기에 출력하는 것으로 하죠.
그럼 이 LabelingResult폼의 디자인은….
보시는 것처럼 픽처박스만 하나 달랑 있습니다. 그리고 솔루션탐색기에서 보면 지금까지의 결과가 있는데요….연두색으로 보이는 것이 클래스이구요….나머지는 폼입니다…..
이제 라벨링을 담당할 클래스를 작성해보죠…
길죠….
그럼 실행화면을 볼까요…
라벨 갯수 즉 객체의 갯수가 16개라고 나왔구요….세워보니 맞네요….ㅄ은 연결되어 있으니 하나로 취급하네요….그리고 각각의 색이 약간씩 변한 그림이 창에 출력이 됩니다…
이번 포스트는 상당히 힘들었네요….디버깅에 1주일 정도 소요가 되었습니다. 주로 배열의 인덱스관련 오류였죠….
사실 코드에 대한 설명이 더 있어야 하는데요…..그냥….넘어가도록 합니다. 혹 의문사항이 있으시면 댓글주세요.
다음 포스트는 외곽선추적에 대한 내용입니다..
지금까지 코드는 ….참고하세요…
이미지처리라벨링코딩완료 (2).zip
(재귀)Blob(Labeling) 알고리즘
Blob Labeling 알고리즘(Connected-component labeling (alternatively connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction) )은 영상처리 분야에서 Labeling을 할 때 주로 쓰는 알고리즘인데, N*N 크기의 2차원이미지에서 인접한(상,하,좌,우,대각선모두포함) 화소에 모두 같은 번호(Label)을 붙이고 연결되지 않은 다른 성분(component)에는 다른 번호를 붙이는 알고리즘인데 주로 이미지 안에 연결되어 있는 객체가 몇개 인지 알아낼 때 사용하는 것이다.
문제는 픽셀 (x,y)가 포함된 blob의 크기를 알아내기 위해서 어떻게 해야 할까?
8×8 이미지가 그림1 처럼 주어진다고 하였을때 픽셀(x=5, y=3)이 속한 blob의 크기를 어떻게 카운트할지 생각해보자.
그림1, 8×8 이미지
먼저 현재 cell이 0과 같지 않다면 다른 색으(여기서는 2로 하겠다)로 칠하고 count를 1증가한다.
이렇게 색칠하는 것은 이 픽셀이 중복 count되는 것을 방지하기 위해서 이다.
현재 셀을 기준으로 북 -> 북동 -> 동, -> 동남 -> 남 … 이런 순서로 검사하다가 인접한 픽셀이 1이면 count를 +1 씩 증가하고 방문한 픽셀은 2로 변경한다. 만약 인접한 픽셀 검사시 2로 되어 있다면 count를 증가할 필요 없다.
그림2. 재귀적으로 순환하는 순서
이처럼 현재 픽셀 기준 -> 북쪽 검사하였는데 이미지 픽셀이라면 그 픽셀의 북쪽을 또 검사하고 …. 반복적으로 검사하다가
만약 인접한 픽셀이 이미지픽셀이 아니라면(base case = 픽셀값이 0인경우) 재귀를 빠져나오면 된다.
이걸 수식으로 표현하면 다음과 같다.
f(x,y) count = 0, if image[x][y] != 0 <- base case f(x,y) count = 1 + count(↑) + count(↗) + count(→) + count(↘) + count(↓) + count(↙) + count(←) + count(↖), if(image[x,y] == 1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 public class BlobAlgorithmMain { static final int IMAGE_COLOR = 1 ; static final int VISITED_COLOR = 2 ; static final int BACKGROUND_COLOR = 0 ; public static void main(String[] args) { int [][]image = { { 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 }, { 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 }, { 1 , 1 , 0 , 0 , 1 , 0 , 1 , 0 }, { 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 }, { 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 }, { 0 , 1 , 1 , 0 , 0 , 1 , 1 , 1 } }; int count = blobCount(image, 5 , 3 , 8 ) ; System.out.println(count); } public static int blobCount( int [][]image, int x, int y, int N) { if (x < 0 | | y < 0 | | x > N – 1 | | y > N – 1 ) { return 0 ; } if (image[x][y] = = VISITED_COLOR | | image[x][y] = = BACKGROUND_COLOR) { return 0 ; } image[x][y] = VISITED_COLOR; return 1 + blobCount(image, x, y – 1 , N) // 북쪽 + blobCount(image, x + 1 , y – 1 , N) // 북동쪽 + blobCount(image, x + 1 , y, N) // 동쪽 + blobCount(image, x + 1 , y + 1 , N) // 동남쪽 + blobCount(image, x, y + 1 , N) // 남쪽 + blobCount(image, x – 1 , y + 1 , N) // 남서쪽 + blobCount(image, x – 1 , y, N) // 서쪽 + blobCount(image, x – 1 , y – 1 , N); // 서북쪽 } } Colored by Color Scripter
[Image Processing] Blob Algorithm (Connected component Labeling)
728×90
반응형
참고자료 1 : http://martinblog.net/826
참고자료 2 : http://blog.daum.net/shksjy/198
참고자료 3 : https://en.wikipedia.org/wiki/Connected-component_labeling
참고자료 4 : http://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_feature_detectors.html
Blob Algorithm
Blob Labeling 알고리즘은 영상처리 분야에서 Labeling을 할 때 주로 쓰는 방법으로서, 인접한 화소에 모두 같은 번호(Label)을 붙이고 연결되지 않은 다른 성분에는 다른 번호를 붙이는 것이다. heuristic 기반의 방법으로 labeling 하는 것이며, 이미지 안에 연결되어 있는 객체가 몇개인지 알아내는 것이다. image recognition system 또는 human-computer interaction 분야에서 필수적으로 쓰이는 방법이다.
라벨링 개념은 아래 표와 같다. OpenCV 3.0 버전이 나올 때 Blob Algorithm(Connected-component labeling, connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction)이 추가되었다.
4 2 2 2 4 4 2 2 2 4 2 2 2 1 2 1 1 3 3 3 3 3 3
레이블링을 하는 방식에는 4방향(십자모양), 8방향 방식(대각선이 추가된 모양)이 있다. vertices 는 comparison heuristic으로써 필요한 정보를 포함하고 있고, ‘neighbors’로 연결된 영역을 가리키는 edges로 구성이 되어있다.
알고리즘을 간략히 설명해보자면,
1. binary image를 기반으로 수행되며 처음에 이미지의 첫번째 픽셀을 시작으로 current label(curlab) 을 지정한다.
2. 그 픽셀이 foreground pixel이고, 아직 label 되지 않았다면 curlab으로 지정하고, queue에 추가한다. 만약 background pixel이고, 이미 label 되었다면 foreground pixel이고 label 되지 않는 pixel을 찾을 때 까지 반복한다.
3. 모둔 수행이 끝나게 되면 queue에서 element를 꺼낸다. 그리고 neighbor을 보고서 (연결된 유형에 따라) foreground pixel이고 이미 라벨링 되지 않았다면 curlab 라벨을 부여하고, queue에 추가한다. 이 과정을 queue에 요소가 없을 때 까지 반복한다.
4. 다시 2번 과정으로 가서 다음픽셀에 대해 과정을 수행하고, curlab 을 1 증가하는 과정을 거친다.
Blob 알고리즘의 코드는 OpenCV Reference를 참조하도록 하는게 좋을 듯 하다.
728×90
반응형
키워드에 대한 정보 영상 처리 라벨링
다음은 Bing에서 영상 처리 라벨링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 데이터 라벨링 부업이란? 3개월 재택근무 데이터 라벨러 프리랜서로 일한 찐 경험과 수익 공개
- 데이터라벨링
- 데이터라벨러
- N잡러
- 부업
- 재택
- 재택프리랜서
- 수익공개
- 데이터라벨링수익
- 데이터라벨링수익공개
- 재택근무
- 데이터라벨링재택
- 알바
- yt:cc=on
데이터 #라벨링 #부업이란? #3개월 #재택근무 #데이터 #라벨러 #프리랜서로 #일한 #찐 #경험과 #수익 #공개
YouTube에서 영상 처리 라벨링 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 데이터 라벨링 부업이란? 3개월 재택근무 데이터 라벨러 프리랜서로 일한 찐 경험과 수익 공개 | 영상 처리 라벨링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.