목차
1. 개요
2. 방법
3. 구현내용
4. 구현결과
2. 방법
3. 구현내용
4. 구현결과
본문내용
+j]) / 3;
}
}
이진화 과정이 끝나면 세선화 과정을 수행한다. 세선화 과정에서는 지문의 선의 굵기를 1픽셀로 줄여 경계 점들을 삭제하여 영역의 골격을 만드는 과정이다. 세선화 알고리즘으로는 Zhang-Suen을 사용하였다.
void ThinningLee(IplImage* inImg, IplImage* outImg)
{
// 골격선 찾기에 의한 세선화
int width = cvGetSize(inImg).width;
int height = cvGetSize(inImg).height;
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
PIXEL_YX(outImg, y, x) = PIXEL_YX(inImg, y, x) ? 1 : 0;
}
}
while(1) {
bool remain = false;
for (int j = 0; j < 4; j++) { // 4가지 이웃 조건
for (int y = 1, ny = height-1; y < ny; y++) {
for(int x = 1, nx = width-1; x < nx; x++) {
const int fny[4] = {0, -1, 0, 1};
const int fnx[4] = {1, 0, -1, 0};
if(PIXEL_YX(outImg, y, x) == 1 &&
PIXEL_YX(outImg, y+fny[j], x+fnx[j]) == 0) {
// 6가지 골격선 조건
if (NeighborMatch(outImg, x, y)) {
// 골격선이면 2로 지정
PIXEL_YX(outImg, y, x) = 2;
}
else { // 골격선이 아니면 제거를 표시
PIXEL_YX(outImg, y, x) = 3;
remain = true;
}
}
}
}
for(int y = 1, ny = height-1; y < ny; y++) {
for(int x = 1, nx = width-1; x < nx; x++) {
// 골격선이 아니면 제거
if(PIXEL_YX(outImg, y, x) == 3) {
PIXEL_YX(outImg, y, x) = 0;
}
}
}
}
if (!remain) break;
}
// 골격선을 255로 표시
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
PIXEL_YX(outImg, y, x) = PIXEL_YX(outImg, y, x) == 2 ? 255 : 0;
}
}
}
다음으로 골격선을 추출하는 알고리즘 이다.
bool NeighborMatch(IplImage* inImg, int x, int y)
{
// 6가진 골격선 조건 패턴 검색 함수
// 골격선이면 true 반환
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x+1)) &&
(PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y , x-1) == 0 &&
PIXEL_YX(inImg, y , x+1) == 0)) return true;
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1)) &&
(PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y-1, x ) == 0)) return true;
if((PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1)) &&
(PIXEL_YX(inImg, y , x+1) == 0 &&
PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y+1, x+1) == 2)) return true;
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y , x+1) == 0 &&
PIXEL_YX(inImg, y-1, x ) == 0 &&
PIXEL_YX(inImg, y-1, x+1) == 2)) return true;
if((PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y-1, x+1)) &&
(PIXEL_YX(inImg, y-1, x ) == 0 &&
PIXEL_YX(inImg, y , x-1) == 0 &&
PIXEL_YX(inImg, y-1, x-1) == 2)) return true;
if((PIXEL_YX(inImg, y+1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x-1)) &&
(PIXEL_YX(inImg, y , x-1) ==0 &&
PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y+1, x-1) == 2)) return true;
return false;
}
4. 구현결과
<이진화 작업>
<세선화 작업>
}
}
이진화 과정이 끝나면 세선화 과정을 수행한다. 세선화 과정에서는 지문의 선의 굵기를 1픽셀로 줄여 경계 점들을 삭제하여 영역의 골격을 만드는 과정이다. 세선화 알고리즘으로는 Zhang-Suen을 사용하였다.
void ThinningLee(IplImage* inImg, IplImage* outImg)
{
// 골격선 찾기에 의한 세선화
int width = cvGetSize(inImg).width;
int height = cvGetSize(inImg).height;
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
PIXEL_YX(outImg, y, x) = PIXEL_YX(inImg, y, x) ? 1 : 0;
}
}
while(1) {
bool remain = false;
for (int j = 0; j < 4; j++) { // 4가지 이웃 조건
for (int y = 1, ny = height-1; y < ny; y++) {
for(int x = 1, nx = width-1; x < nx; x++) {
const int fny[4] = {0, -1, 0, 1};
const int fnx[4] = {1, 0, -1, 0};
if(PIXEL_YX(outImg, y, x) == 1 &&
PIXEL_YX(outImg, y+fny[j], x+fnx[j]) == 0) {
// 6가지 골격선 조건
if (NeighborMatch(outImg, x, y)) {
// 골격선이면 2로 지정
PIXEL_YX(outImg, y, x) = 2;
}
else { // 골격선이 아니면 제거를 표시
PIXEL_YX(outImg, y, x) = 3;
remain = true;
}
}
}
}
for(int y = 1, ny = height-1; y < ny; y++) {
for(int x = 1, nx = width-1; x < nx; x++) {
// 골격선이 아니면 제거
if(PIXEL_YX(outImg, y, x) == 3) {
PIXEL_YX(outImg, y, x) = 0;
}
}
}
}
if (!remain) break;
}
// 골격선을 255로 표시
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
PIXEL_YX(outImg, y, x) = PIXEL_YX(outImg, y, x) == 2 ? 255 : 0;
}
}
}
다음으로 골격선을 추출하는 알고리즘 이다.
bool NeighborMatch(IplImage* inImg, int x, int y)
{
// 6가진 골격선 조건 패턴 검색 함수
// 골격선이면 true 반환
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x+1)) &&
(PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y , x-1) == 0 &&
PIXEL_YX(inImg, y , x+1) == 0)) return true;
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1)) &&
(PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y-1, x ) == 0)) return true;
if((PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1)) &&
(PIXEL_YX(inImg, y , x+1) == 0 &&
PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y+1, x+1) == 2)) return true;
if((PIXEL_YX(inImg, y-1, x-1) ||
PIXEL_YX(inImg, y , x-1) ||
PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1)) &&
(PIXEL_YX(inImg, y , x+1) == 0 &&
PIXEL_YX(inImg, y-1, x ) == 0 &&
PIXEL_YX(inImg, y-1, x+1) == 2)) return true;
if((PIXEL_YX(inImg, y+1, x-1) ||
PIXEL_YX(inImg, y+1, x ) ||
PIXEL_YX(inImg, y+1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y-1, x+1)) &&
(PIXEL_YX(inImg, y-1, x ) == 0 &&
PIXEL_YX(inImg, y , x-1) == 0 &&
PIXEL_YX(inImg, y-1, x-1) == 2)) return true;
if((PIXEL_YX(inImg, y+1, x+1) ||
PIXEL_YX(inImg, y , x+1) ||
PIXEL_YX(inImg, y-1, x+1) ||
PIXEL_YX(inImg, y-1, x ) ||
PIXEL_YX(inImg, y-1, x-1)) &&
(PIXEL_YX(inImg, y , x-1) ==0 &&
PIXEL_YX(inImg, y+1, x ) == 0 &&
PIXEL_YX(inImg, y+1, x-1) == 2)) return true;
return false;
}
4. 구현결과
<이진화 작업>
<세선화 작업>
추천자료
- 방송 광고의 산업적 문화적 가치 재조명 (방송광고)
- 범죄수사론 요점정리
- 삼성물산 기업분석
- 지식경영
- 고도정보화 사회와 도서관의 정보화 방향
- 참이슬과 처음처럼 마케팅전략비교 분석
- [도서관][도서관사][정보화][도서관의 최초 설립자][동양의 도서관사][도서관의 자료][도서관...
- 문학교육전략(수업전략), 독서교육전략(수업전략), 양성평등수학교육전략(수업전략), ICT활용...
- CAI(컴퓨터보조수업, 컴퓨터보조학습)의 종류, CAI(컴퓨터보조수업, 컴퓨터보조학습) 장점, C...
- 필립스(PHILIPS) 마케팅사례분석 및 새로운 마케팅전략제안
- 듀오,마케팅,브랜드,브랜드마케팅,기업,서비스마케팅,글로벌,경영,시장,사례,swot,stp,4p
- 물류운영정보
- 삼국사기 고구려 본기 『동명성왕, 유리왕』신화 속 에서 살아가던 그들의 인간적인 이면과 삶
- [해외홍보][해외PR][해외][홍보][PR][방송]해외홍보(해외PR)의 필요성, 해외홍보(해외PR)의 ...
소개글