●이미지 데이터 처리
- 히스토그램
![](https://t1.daumcdn.net/cfile/tistory/2272F7505655733127)
●소스 코딩
- 데이터처리는 다음과 같다.
//////////////////// for (uiYCnt = 0; uiYCnt < YSCALE; ++uiYCnt) { for (uiXCnt = 0; uiXCnt < XSCALE; ++uiXCnt) { SetPixel(MemDC, uiXCnt, YSCALE - uiYCnt, RGB( *(Vdata + (3 * (uiYCnt*XSCALE + uiXCnt)) + 2), *(Vdata + (3 * (uiYCnt*XSCALE + uiXCnt)) + 1), *(Vdata + (3 * (uiYCnt*XSCALE + uiXCnt)) + 0)));
++uiHis1[Vdata[3 * ((uiYCnt*XSCALE) + (uiXCnt)) + 0]]; ++uiHis1[Vdata[3 * ((uiYCnt*XSCALE) + (uiXCnt)) + 1]]; ++uiHis1[Vdata[3 * ((uiYCnt*XSCALE) + (uiXCnt)) + 2]]; } } //////////////////////X축을 기준으로 라인 별로 그래프의 높이를 설정한다. uiMaxVal1 = 0; for (uiXCnt = 0; uiXCnt < XGRAPH; ++uiXCnt) { uiHis1[uiXCnt] = uiHis1[uiXCnt] / 3; if (uiMaxVal1 < uiHis1[uiXCnt]) { uiMaxVal1 = uiHis1[uiXCnt]; } } //////////////////////오차 줄이기 for (uiXCnt = 0; uiXCnt < XGRAPH; ++uiXCnt) { uiHis1[uiXCnt] = (uiHis1[uiXCnt] * YGRAPH) / uiMaxVal1; } |
- <main.c> 첨부파일
1.main(히스토 그램).c
●결과(사진)
![](https://t1.daumcdn.net/cfile/tistory/2466443E565572A228)
![](https://t1.daumcdn.net/cfile/tistory/2272603E565572A31B)
![](https://t1.daumcdn.net/cfile/tistory/221CCB3E565572A521)
![](https://t1.daumcdn.net/cfile/tistory/253E323E565572A91F)
![](https://t1.daumcdn.net/cfile/tistory/23775B3E565572AC19)
●결과(동영상)
◉Alpha
●Alpha
- 알파 값이란?
- 투명한 색상을 변경할 색깔.
- 크로마키
- 특정한 색을 원하는 색으로 바꾼다.
- 특정한 색을 찾아야 한다.
●실습
- 칠판을 기준으로 진행한다.
![](https://t1.daumcdn.net/cfile/tistory/21674A3E565572A011)
- 칠판의 마스크 할 부분의 정보를 추출한다.
●소스 코딩
- 위의 정보를 바탕으로 다음과 같이 define를 한다.
#define MALPHA 168 #define GALPHA 20 #define HALPHA (MALPHA + GALPHA) #define LALPHA (MALPHA - GALPHA) |
- 2중 for문을 사용하여 memcpy를 대체한다.
- 목표는 칠판으로 한다.
- if문을 통해 원하는 값을 추려낼 수 있다.
for (uiYCnt = 0; uiYCnt < YSCALE; ++uiYCnt) { for (uiXCnt = 0; uiXCnt < XSCALE; ++uiXCnt) { iCal = 3 * (uiYCnt*XSCALE + uiXCnt); //중복되는 계산 코드 //Vdata[3 * (uiYCnt*XSCALE + uiXCnt) + 0] = lpVHdr->lpData[3 * (uiYCnt*XSCALE + uiXCnt) + 0]; Vdata[iCal + 0] = *(lpVHdr->lpData + (iCal + 0)); Vdata[iCal + 1] = *(lpVHdr->lpData + (iCal + 1)); Vdata[iCal + 2] = *(lpVHdr->lpData + (iCal + 2));
if (HALPHA < Vdata[iCal + 0]) { continue; } if (LALPHA > Vdata[iCal + 0]) { continue; }
if (HALPHA < Vdata[iCal + 1]) { continue; } if (LALPHA > Vdata[iCal + 1]) { continue; }
if (HALPHA < Vdata[iCal + 2]) { continue; } if (LALPHA > Vdata[iCal + 2]) { continue; } //위의 if문을 전부 통과했다는 것은 마스크 할 부분이라는 뜻이다. Vdata[iCal + 0] = 255; Vdata[iCal + 1] = 0; Vdata[iCal + 2] = 0; } } |
- 결과
![](https://t1.daumcdn.net/cfile/tistory/262EF93E565572AF16)
- GAP의 값 조절에 의해서 더욱 선명하게 구분할 수 있다.
●비트맵 씌우기
- 칠판의 바탕을 기준으로 칠판을 준비된 비트맵으로 대체한다.
![](https://t1.daumcdn.net/cfile/tistory/265AB246565572B129)