전역 변수
unsigned char ** m_InputImageR = NULL;
unsigned char ** m_InputImageG = NULL;
unsigned char ** m_InputImageB = NULL;
unsigned char ** m_OutputImageR = NULL;
unsigned char ** m_OutputImageG = NULL;
unsigned char ** m_OutputImageB = NULL;
int m_height;
int m_width;
int m_Re_height;
int m_Re_width;
int m_old_height;
int m_old_width;
int m_old_Re_height;
int m_old_Re_width;
2차원 동적 배열 할당
unsigned char** malloc2D(int h, int w)
{
// TODO: 여기에 구현 코드 추가.
unsigned char** p;
p = (unsigned char**)malloc(h * sizeof(unsigned char*));
for (int i = 0; i < h; i++)
p[i] = (unsigned char*)malloc(w * sizeof(unsigned char));
return p;
}
입력 이미지 초기화
void freeInputImage(int h)
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR != NULL) {
for (int i = 0; i < h; i++)
free(m_InputImageR[i]);
free(m_InputImageR);
}
m_InputImageR = NULL;
if (m_InputImageG != NULL) {
for (int i = 0; i < h; i++)
free(m_InputImageG[i]);
free(m_InputImageG);
}
m_InputImageG = NULL;
if (m_InputImageB != NULL) {
for (int i = 0; i < h; i++)
free(m_InputImageB[i]);
free(m_InputImageB);
}
m_InputImageB = NULL;
}
출력 이미지 초기화
void freeOutputImage(int h)
{
// TODO: 여기에 구현 코드 추가.
if (m_OutputImageR != NULL) {
for (int i = 0; i < h; i++)
free(m_OutputImageR[i]);
free(m_OutputImageR);
}
m_OutputImageR = NULL;
if (m_OutputImageG != NULL) {
for (int i = 0; i < h; i++)
free(m_OutputImageG[i]);
free(m_OutputImageG);
}
m_OutputImageG = NULL;
if (m_OutputImageB != NULL) {
for (int i = 0; i < h; i++)
free(m_OutputImageB[i]);
free(m_OutputImageB);
}
m_OutputImageB = NULL;
}
이미지 오픈(on MFC)
BOOL CMFCApplication1Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: 여기에 특수화된 작성 코드를 추가합니다.
// Color 이미지 처리 클래스
CImage m_bitmap;
m_bitmap.Load(lpszPathName);
// 기존 메모리 해제
freeInputImage(m_old_height);
// 중요! 입력 영상 크기 결정
m_height = m_bitmap.GetHeight();
m_width = m_bitmap.GetWidth();
m_old_height = m_height;
m_old_width = m_width;
// 메모리 할당
m_InputImageR = malloc2D(m_height, m_width);
m_InputImageG = malloc2D(m_height, m_width);
m_InputImageB = malloc2D(m_height, m_width);
// 칼라 이미지 --> 메모리
COLORREF pixel;
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
pixel = m_bitmap.GetPixel(i, k);
m_InputImageR[k][i] = (unsigned char)GetRValue(pixel);
m_InputImageG[k][i] = (unsigned char)GetGValue(pixel);
m_InputImageB[k][i] = (unsigned char)GetBValue(pixel);
}
return TRUE;
}
종료 시(on MFC)
void OnCloseDocument()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
freeInputImage(m_height);
freeOutputImage(m_Re_height);
CDocument::OnCloseDocument();
}
동일 영상 알고리즘
void OnEqualColor()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[i][k];
m_OutputImageG[i][k] = m_InputImageG[i][k];
m_OutputImageB[i][k] = m_InputImageB[i][k];
}
}
}
반전연산알고리즘
void OnNegativeImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
m_OutputImageR[i][k] = 255 - m_InputImageR[i][k];
m_OutputImageG[i][k] = 255 - m_InputImageG[i][k];
m_OutputImageB[i][k] = 255 - m_InputImageB[i][k];
}
}
}
더하기연산 알고리즘
void OnAddImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int s = dlg.m_value;
int aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = s + m_InputImageR[i][k];
aG = s + m_InputImageG[i][k];
aB = s + m_InputImageB[i][k];
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
빼기연산 알고리즘
void OnSubImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int s = dlg.m_value;
int aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = s - m_InputImageR[i][k];
aG = s - m_InputImageG[i][k];
aB = s - m_InputImageB[i][k];
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
곱하기 연산 알고리즘
void OnMulImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int s = dlg.m_value;
int aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = s * m_InputImageR[i][k];
aG = s * m_InputImageG[i][k];
aB = s * m_InputImageB[i][k];
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
나누기 연산 알고리즘
void OnDivImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int s = dlg.m_value;
int aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = s / m_InputImageR[i][k];
aG = s / m_InputImageG[i][k];
aB = s / m_InputImageB[i][k];
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
감마 연산 알고리즘
void OnGammaImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
double s = dlg.m_value;
double aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = pow(m_InputImageR[i][k], 1 / s);
aG = pow(m_InputImageG[i][k], 1 / s);
aB = pow(m_InputImageB[i][k], 1 / s);
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
else m_OutputImageR[i][k] = aR;
else m_OutputImageG[i][k] = aG;
else m_OutputImageB[i][k] = aB;
}
}
}
명암 대비 스트레치(늘리기) 알고리즘
void OnStretchImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
double s = dlg.m_value;
double aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = ((m_InputImageR[i][k] - 128) * s) + 128;
aG = ((m_InputImageG[i][k] - 128) * s) + 128;
aB = ((m_InputImageB[i][k] - 128) * s) + 128;
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
명암 대비 압축 알고리즘
void OnCompressImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
double s = dlg.m_value;
double aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
aR = ((m_InputImageR[i][k] - 128) * s) + 128;
aG = ((m_InputImageG[i][k] - 128) * s) + 128;
aB = ((m_InputImageB[i][k] - 128) * s) + 128;
if (aR > 255) aR = 255;
else if (aR < 0) aR = 0;
if (aG > 255) aG = 255;
else if (aG < 0) aG = 0;
if (aB > 255) aB = 255;
else if (aB < 0) aB = 0;
m_OutputImageR[i][k] = aR;
m_OutputImageG[i][k] = aG;
m_OutputImageB[i][k] = aB;
}
}
}
포스터라이징 변환
void OnPosterizing()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int s = 255 / dlg.m_value;
int aR, aG, aB;
for (int i = 0; i < m_height; i++) {
for (int k = 0, cnt; k < m_width; k++) {
cnt = 0;
aR = m_InputImageR[i][k];
for (; s * cnt < aR; cnt++);
if (s * cnt > 255) m_OutputImageR[i][k] = 255;
else if (s * cnt < 0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = cnt * s;
}
}
for (int i = 0; i < m_height; i++) {
for (int k = 0, cnt; k < m_width; k++) {
cnt = 0;
aG = m_InputImageG[i][k];
for (; s * cnt < aG; cnt++);
if (s * cnt > 255) m_OutputImageG[i][k] = 255;
else if (s * cnt < 0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = cnt * s;
}
}
for (int i = 0; i < m_height; i++) {
for (int k = 0, cnt; k < m_width; k++) {
cnt = 0;
aB = m_InputImageB[i][k];
for (; s * cnt < aB; cnt++);
if (s * cnt > 255) m_OutputImageB[i][k] = 255;
else if (s * cnt < 0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = cnt * s;
}
}
}
이진화 변환
void OnBinaryImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int avr;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
avr = (m_InputImageR[i][k] + m_InputImageG[i][k] + m_InputImageB[i][k]) / 3.0;
if (avr > 128) m_OutputImageR[i][k] = 255;
else if (avr <= 128) m_OutputImageR[i][k] = 0;
if (avr > 128) m_OutputImageG[i][k] = 255;
else if (avr <= 128) m_OutputImageG[i][k] = 0;
if (avr > 128) m_OutputImageB[i][k] = 255;
else if (avr <= 128) m_OutputImageB[i][k] = 0;
}
}
}
범위 강조 변환
void OnStreTranImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CTWOQ dlg;
if (dlg.DoModal() != IDOK) return;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int high = dlg.m_value1;
int low = dlg.m_value2;
int avr;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
avr = (m_InputImageR[i][k] + m_InputImageG[i][k] + m_InputImageB[i][k]) / 3.0;
if (low <= avr && avr <= high) {
m_OutputImageR[i][k] = 255;
m_OutputImageG[i][k] = 255;
m_OutputImageB[i][k] = 255;
}
else {
m_OutputImageR[i][k] = m_InputImageR[i][k];
m_OutputImageG[i][k] = m_InputImageG[i][k];
m_OutputImageB[i][k] = m_InputImageB[i][k];
}
}
}
}
확대(백워딩)
void OnZoomInBack()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
int val = dlg.m_value;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height * val;
m_old_Re_height = m_Re_width = m_width * val;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[i/val][k/val];
m_OutputImageG[i][k] = m_InputImageG[i/val][k/val];
m_OutputImageB[i][k] = m_InputImageB[i/val][k/val];
}
}
}
확대(선형 보간법)
void Recur(int s, int x, int y)
{
int hs = s / 2;
m_OutputImageR[y][x + hs] = (m_OutputImageR[y][x] + m_OutputImageR[y][x + s]) / 2;
m_OutputImageR[y + hs][x] = (m_OutputImageR[y][x] + m_OutputImageR[y + s][x]) / 2;
m_OutputImageR[y + hs][x + hs] = (m_OutputImageR[y][x] + m_OutputImageR[y + s][x + s]) / 2;
m_OutputImageR[y + hs][x + s] = (m_OutputImageR[y][x + s] + m_OutputImageR[y + s][x + s]) / 2;
m_OutputImageR[y + s][x + hs] = (m_OutputImageR[y + s][x] + m_OutputImageR[y + s][x + s]) / 2;
m_OutputImageG[y][x + hs] = (m_OutputImageG[y][x] + m_OutputImageG[y][x + s]) / 2;
m_OutputImageG[y + hs][x] = (m_OutputImageG[y][x] + m_OutputImageG[y + s][x]) / 2;
m_OutputImageG[y + hs][x + hs] = (m_OutputImageG[y][x] + m_OutputImageG[y + s][x + s]) / 2;
m_OutputImageG[y + hs][x + s] = (m_OutputImageG[y][x + s] + m_OutputImageG[y + s][x + s]) / 2;
m_OutputImageG[y + s][x + hs] = (m_OutputImageG[y + s][x] + m_OutputImageG[y + s][x + s]) / 2;
m_OutputImageB[y][x + hs] = (m_OutputImageB[y][x] + m_OutputImageB[y][x + s]) / 2;
m_OutputImageB[y + hs][x] = (m_OutputImageB[y][x] + m_OutputImageB[y + s][x]) / 2;
m_OutputImageB[y + hs][x + hs] = (m_OutputImageB[y][x] + m_OutputImageB[y + s][x + s]) / 2;
m_OutputImageB[y + hs][x + s] = (m_OutputImageB[y][x + s] + m_OutputImageB[y + s][x + s]) / 2;
m_OutputImageB[y + s][x + hs] = (m_OutputImageB[y + s][x] + m_OutputImageB[y + s][x + s]) / 2;
if (hs > 1) {
Recur(hs, x, y);
Recur(hs, x + hs, y);
Recur(hs, x, y + hs);
Recur(hs, x + hs, y + hs);
}
}
void OnLinear()
{
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
int scale = dlg.m_value;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height * scale;
m_old_Re_height = m_Re_width = m_width * scale;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for(int i=0;i<m_height;i++)
for (int k = 0; k < m_width; k++) {
m_OutputImageR[i*scale][k*scale] = m_InputImageR[i][k];
m_OutputImageG[i*scale][k*scale] = m_InputImageG[i][k];
m_OutputImageB[i*scale][k*scale] = m_InputImageB[i][k];
}
int x, y;
for (int i = 0; i < m_height-1; i++)
for (int k = 0; k < m_width-1; k++) {
x = k * scale; y = i * scale;
Recur(scale, x, y);
}
}
축소
void OnZoomOut()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
double val = dlg.m_value;
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height / val;
m_old_Re_height = m_Re_width = m_width / val;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[i * (int)val][k * (int)val];
m_OutputImageG[i][k] = m_InputImageG[i * (int)val][k * (int)val];
m_OutputImageB[i][k] = m_InputImageB[i * (int)val][k * (int)val];
}
}
}
회전(백워딩,중심점,크기 보정)
void OnCnbnzRotate()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
CONEQ dlg;
if (dlg.DoModal() != IDOK) return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
double value = dlg.m_value;
double rad = value * 3.141592 / 180.0;
double w = m_height * abs(cos(90.0 * 3.141592 / 180.0 - rad)) + m_width * abs(cos(rad));
double h = m_height * abs(cos(rad)) + m_width * abs(cos(90.0 * 3.141592 / 180.0 - rad));
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = (int)h;
m_old_Re_width = m_Re_width = (int)w;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int dx, dy, hy = m_height-1;
int ocx = m_width / 2.0;
int ocy = m_height / 2.0;
int cx = w / 2.0;
int cy = h / 2.0;
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
dx = ((k - cx) * cos(rad)) - ((i - cy) * sin(rad)) + ocx;
dy = ((k - cx) * sin(rad)) + ((i - cy) * cos(rad)) + ocy;
if ((0<=dx && dx < m_width) && (0 <= dy && dy < m_height)) {
m_OutputImageR[i][k] = m_InputImageR[dy][dx];
m_OutputImageG[i][k] = m_InputImageG[dy][dx];
m_OutputImageB[i][k] = m_InputImageB[dy][dx];
}
}
}
}
히스토그램 스트레치
void OnHistogram()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
int R, G, B, o;
int minR, maxR, minG, maxG, minB, maxB;
minR = m_InputImageR[0][0], maxR = m_InputImageR[0][0];
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (m_InputImageR[i][k] > maxR) maxR = m_InputImageR[i][k];
if (m_InputImageR[i][k] < minR) minR = m_InputImageR[i][k];
}
minG = m_InputImageG[0][0], maxG = m_InputImageG[0][0];
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (m_InputImageG[i][k] > maxG) maxG = m_InputImageG[i][k];
if (m_InputImageG[i][k] < minG) minG = m_InputImageG[i][k];
}
minB = m_InputImageB[0][0], maxB = m_InputImageB[0][0];
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (m_InputImageB[i][k] > maxB) maxB = m_InputImageB[i][k];
if (m_InputImageB[i][k] < minB) minB = m_InputImageB[i][k];
}
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
R = (m_InputImageR[i][k] - minR) / (double)(maxR - minR) * 255;
G = (m_InputImageG[i][k] - minG) / (double)(maxG - minG) * 255;
B = (m_InputImageB[i][k] - minB) / (double)(maxB - minB) * 255;
if (R > 255) m_OutputImageR[i][k] = 255;
else if (R < 0) m_OutputImageR[i][k] = 0;
else if (0 <= R && R < 256) m_OutputImageR[i][k] = R;
if (G > 255) m_OutputImageG[i][k] = 255;
else if (G < 0) m_OutputImageG[i][k] = 0;
else if (0 <= G && G < 256) m_OutputImageG[i][k] = G;
if (B > 255) m_OutputImageB[i][k] = 255;
else if (B < 0) m_OutputImageB[i][k] = 0;
else if (0 <= B && B < 256) m_OutputImageB[i][k] = B;
}
}
}
히스토그램 엔드인탐색
void OnEndInSearch()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
CTWOQ dlg;
if (dlg.DoModal() != IDOK) return;
int min = dlg.m_value2, max = dlg.m_value1;
int R, G, B;
int AR, AG, AB;
double avr;
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
R = m_InputImageR[i][k];
G = m_InputImageG[i][k];
B = m_InputImageB[i][k];
avr = (R + G + B) / 3.0;
R = ((m_InputImageR[i][k] - avr) - min) / (double)(max - min) * 255;
G = ((m_InputImageG[i][k] - avr)- min) / (double)(max - min) * 255;
B = ((m_InputImageB[i][k] - avr) - min) / (double)(max - min) * 255;
avr = (avr - min) / (double)(max - min) * 255;
/*
AR = (avr - min) / (double)(max - min) * 255;
AG = (avr - min) / (double)(max - min) * 255;
AB = (avr - min) / (double)(max - min) * 255;*/
R += avr; G += avr; B += avr;
if (R > max) m_OutputImageR[i][k] = 255;
else if (R < min) m_OutputImageR[i][k] = 0;
else if (min <= R && R < max) m_OutputImageR[i][k] = R;
if (G > max) m_OutputImageG[i][k] = 255;
else if (G < min) m_OutputImageG[i][k] = 0;
else if (min <= G && G < max) m_OutputImageG[i][k] = G;
if (B > max) m_OutputImageB[i][k] = 255;
else if (B < min) m_OutputImageB[i][k] = 0;
else if (min <= B && B < max) m_OutputImageB[i][k] = B;
}
}
}
평활화
void RGBtoHSV(int R, int G, int B, double* H, double* S, double* V)
{
// TODO: 여기에 구현 코드 추가.
//R, G and B input range = 0 ÷ 255
//H, S and V output range = 0 ÷ 1.0
double var_R = (R / 255.0);
double var_G = (G / 255.0);
double var_B = (B / 255.0);
double var_Min = min(min(var_R, var_G), var_B); //Min. value of RGB
double var_Max = max(max(var_R, var_G), var_B); //Max. value of RGB
double del_Max = var_Max - var_Min; //Delta RGB value
*V = var_Max;
if (del_Max == 0) //This is a gray, no chroma...
{
*H = 0;
*S = 0;
}
else //Chromatic data...
{
*S = del_Max / var_Max;
double del_R = (((var_Max - var_R) / 6.0) + (del_Max / 2.0)) / del_Max;
double del_G = (((var_Max - var_G) / 6.0) + (del_Max / 2.0)) / del_Max;
double del_B = (((var_Max - var_B) / 6.0) + (del_Max / 2.0)) / del_Max;
if (var_R == var_Max) *H = del_B - del_G;
else if (var_G == var_Max) *H = (1 / 3.0) + del_R - del_B;
else if (var_B == var_Max) *H = (2 / 3.0) + del_G - del_R;
if (*H < 0.0) *H += 1;
if (*H > 1.0) *H -= 1;
}
}
void HSVtoRGB(unsigned char* R, unsigned char* G,unsigned char* B,
double H, double S, double V)
{
// TODO: 여기에 구현 코드 추가.
//H, S and V input range = 0 ÷ 1.0
//R, G and B output range = 0 ÷ 255
if (S == 0)
{
*R = V * 255;
*G = V * 255;
*B = V * 255;
}
else
{
double var_h = H * 6;
if (var_h == 6) var_h = 0; //H must be < 1
int var_i = int(var_h); //Or ... var_i = floor( var_h )
double var_1 = V * (1 - S);
double var_2 = V * (1 - S * (var_h - var_i));
double var_3 = V * (1 - S * (1 - (var_h - var_i)));
double var_r, var_g, var_b;
if (var_i == 0) { var_r = V; var_g = var_3; var_b = var_1; }
else if (var_i == 1) { var_r = var_2; var_g = V; var_b = var_1; }
else if (var_i == 2) { var_r = var_1; var_g = V; var_b = var_3; }
else if (var_i == 3) { var_r = var_1; var_g = var_2; var_b = V; }
else if (var_i == 4) { var_r = var_3; var_g = var_1; var_b = V; }
else { var_r = V; var_g = var_1; var_b = var_2; }
//var_r *= 255;
*R = var_r * 255.0;
*G = var_g * 255.0;
*B = var_b * 255.0;
}
}
double** malloc2D_double(int h, int w)
{
// TODO: 여기에 구현 코드 추가.
double** p;
p = (double**)malloc(h * sizeof(double*));
for (int i = 0; i < h; i++)
p[i] = (double*)malloc(w * sizeof(double));
return p;
}
void OnEqualized()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
double** TempImageH = malloc2D_double(m_Re_height, m_Re_width);
double** TempImageS = malloc2D_double(m_Re_height, m_Re_width);
double** TempImageV = malloc2D_double(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
double* pH, * pS, * pV;
int R, G, B;
pH = &TempImageH[i][k];
pS = &TempImageS[i][k];
pV = &TempImageV[i][k];
R = m_InputImageR[i][k];
G = m_InputImageG[i][k];
B = m_InputImageB[i][k];
RGBtoHSV(R, G, B, pH, pS, pV);
}
int sumV[256] = { 0, }, cntV[256] = { 0, };
//int sumS[256] = { 0, }, cntS[256] = { 0, };
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
cntV[(int)(TempImageV[i][k] * 255.0)]++;
//cntS[(int)(TempImageS[i][k] * 255.0)]++;
}
int sV = 0;
//int sS = 0;
double nV[256] = { 0.0, };
//double nS[256] = { 0.0, };
for (int i = 0; i < 256; i++) {
sV += cntV[i]; //sS += cntS[i];
sumV[i] = sV; //sumS[i] = sS;
}
for (int i = 0; i < 256; i++) {
nV[i] = (double)sumV[i] * (1.0 / sumV[255]) * 255.0;
//nS[i] = (double)sumS[i] * (1.0 / sumS[255]) * 255.0;
}
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
TempImageV[i][k] = nV[(int)(TempImageV[i][k] * 255)] / 255.0;
//TempImageS[i][k] = nS[(int)(TempImageS[i][k] * 255)] / 255.0;
}
unsigned char* pR, * pG, * pB;
double H, S, V;
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_height; k++) {
H = TempImageH[i][k];
S = TempImageS[i][k];
V = TempImageV[i][k];
pR = &m_OutputImageR[i][k];
pG = &m_OutputImageG[i][k];
pB = &m_OutputImageB[i][k];
HSVtoRGB(pR, pG, pB, H, S, V);
}
for (int i = 0; i < m_Re_height; i++) {
free(TempImageH[i]);
free(TempImageS[i]);
free(TempImageV[i]);
}
TempImageH = NULL;
TempImageS = NULL;
TempImageV = NULL;
}
엠보싱
void freeTemp(double** p, int h)
{
// TODO: 여기에 구현 코드 추가.
if (p != NULL) {
for (int i = 0; i < h; i++)
free(p[i]);
free(p);
}
p = NULL;
}
void OnEmbossing()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {-1.0,0.0,0.0},
{ 0.0,0.0,0.0},
{ 0.0,0.0,1.0} };
//임시 입출메모리 확보
double** tmpInput, ** tmpOutput;
tmpInput = malloc2D_double(m_height + 2, m_width + 2);
tmpOutput = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++)
tmpInput[i + 1][k + 1] = (double)m_InputImageR[i][k];
double S;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
S = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
S += tmpInput[i + m][k + n] * mask[m][n];
}
}
tmpOutput[i][k] = S;
}
}
//마스크 총합이 0이면 127을 더하기.
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++)
tmpOutput[i][k] += 127.0;
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutput[i][k] > 255.0) m_OutputImageR[i][k] = 255;
else if (tmpOutput[i][k] < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)tmpOutput[i][k];
}
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++)
tmpInput[i + 1][k + 1] = (double)m_InputImageG[i][k];
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
S = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
S += tmpInput[i + m][k + n] * mask[m][n];
}
}
tmpOutput[i][k] = S;
}
}
//마스크 총합이 0이면 127을 더하기.
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++)
tmpOutput[i][k] += 127.0;
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutput[i][k] > 255.0) m_OutputImageG[i][k] = 255;
else if (tmpOutput[i][k] < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)tmpOutput[i][k];
}
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++)
tmpInput[i + 1][k + 1] = (double)m_InputImageB[i][k];
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
S = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
S += tmpInput[i + m][k + n] * mask[m][n];
}
}
tmpOutput[i][k] = S;
}
}
//마스크 총합이 0이면 127을 더하기.
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++)
tmpOutput[i][k] += 127.0;
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutput[i][k] > 255.0) m_OutputImageB[i][k] = 255;
else if (tmpOutput[i][k] < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)tmpOutput[i][k];
}
freeTemp(tmpInput, m_height + 2);
freeTemp(tmpOutput, m_height);
}
블러
void OnBlur()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {1.0 / 9.0,1.0 / 9.0,1.0 / 9.0},
{ 1.0 / 9.0,1.0 / 9.0,1.0 / 9.0},
{ 1.0 / 9.0,1.0 / 9.0,1.0 / 9.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputR[i][k] > 255.0) m_OutputImageR[i][k] = 255;
else if (tmpOutputR[i][k] < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)tmpOutputR[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputG[i][k] > 255.0) m_OutputImageG[i][k] = 255;
else if (tmpOutputG[i][k] < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)tmpOutputG[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputB[i][k] > 255.0) m_OutputImageB[i][k] = 255;
else if (tmpOutputB[i][k] < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)tmpOutputB[i][k];
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
가우시안 스무딩 필터
void OnSmoothing()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {1.0 / 16.0,1.0 / 8.0,1.0 / 16.0},
{ 1.0 / 8.0,1.0 / 4.0,1.0 / 8.0},
{ 1.0 / 16.0,1.0 / 8.0,1.0 / 16.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputR[i][k] > 255.0) m_OutputImageR[i][k] = 255;
else if (tmpOutputR[i][k] < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)tmpOutputR[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputG[i][k] > 255.0) m_OutputImageG[i][k] = 255;
else if (tmpOutputG[i][k] < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)tmpOutputG[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputB[i][k] > 255.0) m_OutputImageB[i][k] = 255;
else if (tmpOutputB[i][k] < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)tmpOutputB[i][k];
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
샤프닝
void OnSharpning()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {0.0,-1.0,0.0},
{ -1.0,5.0,-1.0},
{0.0,-1.0,0.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputR[i][k] > 255.0) m_OutputImageR[i][k] = 255;
else if (tmpOutputR[i][k] < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)tmpOutputR[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputG[i][k] > 255.0) m_OutputImageG[i][k] = 255;
else if (tmpOutputG[i][k] < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)tmpOutputG[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputB[i][k] > 255.0) m_OutputImageB[i][k] = 255;
else if (tmpOutputB[i][k] < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)tmpOutputB[i][k];
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
고주파 통과 필터
void OnHpf()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {-1.0 / 9.0,-1.0 / 9.0,-1.0 / 9.0},
{ -1.0 / 9.0,8.0 / 9.0,-1.0 / 9.0},
{-1.0 / 9.0,-1.0 / 9.0,-1.0 / 9.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputR[i][k] > 255.0) m_OutputImageR[i][k] = 255;
else if (tmpOutputR[i][k] < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)tmpOutputR[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputG[i][k] > 255.0) m_OutputImageG[i][k] = 255;
else if (tmpOutputG[i][k] < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)tmpOutputG[i][k];
}
for (int k = 0; k < m_Re_width; k++) {
if (tmpOutputB[i][k] > 255.0) m_OutputImageB[i][k] = 255;
else if (tmpOutputB[i][k] < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)tmpOutputB[i][k];
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
언샤프닝(원본-저주파 통과 이미지)
void OnLpf()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {1.0 / 9.0,1.0 / 9.0,1.0 / 9.0},
{ 1.0 / 9.0,1.0 / 9.0,1.0 / 9.0},
{ 1.0 / 9.0,1.0 / 9.0,1.0 / 9.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
SR = m_InputImageR[i][k] - tmpOutputR[i][k];
if (SR > 255.0) m_OutputImageR[i][k] = 255;
else if (SR < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)SR;
}
for (int k = 0; k < m_Re_width; k++) {
SG = m_InputImageR[i][k] - tmpOutputR[i][k];
if (SG > 255.0) m_OutputImageG[i][k] = 255;
else if (SG < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)SG;
}
for (int k = 0; k < m_Re_width; k++) {
SB = m_InputImageR[i][k] - tmpOutputR[i][k];
if (SB > 255.0) m_OutputImageB[i][k] = 255;
else if (SB < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)SB;
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
이미지 이동 엣지검출
void OnShift()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {0.0,-1.0,0.0},
{0.0,1.0,0.0},
{0.0,0.0,0.0} };
//임시 입출메모리 확보
double** tmpInputR, ** tmpOutputR, ** tmpInputG, ** tmpOutputG, ** tmpInputB, ** tmpOutputB;
tmpInputR = malloc2D_double(m_height + 2, m_width + 2);
tmpInputG = malloc2D_double(m_height + 2, m_width + 2);
tmpInputB = malloc2D_double(m_height + 2, m_width + 2);
tmpOutputR = malloc2D_double(m_height, m_width);
tmpOutputG = malloc2D_double(m_height, m_width);
tmpOutputB = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInputR[i + 1][k + 1] = (double)m_InputImageR[i][k];
tmpInputG[i + 1][k + 1] = (double)m_InputImageG[i][k];
tmpInputB[i + 1][k + 1] = (double)m_InputImageB[i][k];
}
double SR, SG, SB;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
SR = 0.0, SG = 0.0, SB = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
SR += tmpInputR[i + m][k + n] * mask[m][n];
SG += tmpInputG[i + m][k + n] * mask[m][n];
SB += tmpInputB[i + m][k + n] * mask[m][n];
}
}
tmpOutputR[i][k] = SR;
tmpOutputG[i][k] = SG;
tmpOutputB[i][k] = SB;
}
}
//임시 output -->진짜 output
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
SR = tmpOutputR[i][k];
if (SR > 255.0) m_OutputImageR[i][k] = 255;
else if (SR < 0.0) m_OutputImageR[i][k] = 0;
else m_OutputImageR[i][k] = (int)SR;
}
for (int k = 0; k < m_Re_width; k++) {
SG = tmpOutputR[i][k];
if (SG > 255.0) m_OutputImageG[i][k] = 255;
else if (SG < 0.0) m_OutputImageG[i][k] = 0;
else m_OutputImageG[i][k] = (int)SG;
}
for (int k = 0; k < m_Re_width; k++) {
SB = tmpOutputR[i][k];
if (SB > 255.0) m_OutputImageB[i][k] = 255;
else if (SB < 0.0) m_OutputImageB[i][k] = 0;
else m_OutputImageB[i][k] = (int)SB;
}
}
freeTemp(tmpInputR, m_height + 2);
freeTemp(tmpOutputR, m_height);
freeTemp(tmpInputG, m_height + 2);
freeTemp(tmpOutputG, m_height);
freeTemp(tmpInputB, m_height + 2);
freeTemp(tmpOutputB, m_height);
}
유사연산자 엣지검출
void OnHomogenOperator()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
//마스크
double mask[3][3] = { {1.0,1.0,1.0},
{1.0,1.0,1.0},
{1.0,1.0,1.0} };
//임시 입출메모리 확보
double** tmpInput, ** tmpOutput;
tmpInput = malloc2D_double(m_height + 2, m_width + 2);
tmpOutput = malloc2D_double(m_height, m_width);
//input->tempinput
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++) {
tmpInput[i + 1][k + 1] = (m_InputImageR[i][k] + m_InputImageG[i][k] + m_InputImageB[i][k]) / 3.0;
}
double S, dif;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
dif = 0.0;
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 3; n++) {
S = tmpInput[i + 1][k + 1] - tmpInput[i + m][k + n];
if (S > dif) dif = S;
}
}
tmpOutput[i][k] = dif;
}
}
double t;
for (int i = 0; i < m_Re_height; i++) {
for (int k = 0; k < m_Re_width; k++) {
t = tmpOutput[i][k];
if (t > 255.0) t = 255.0;
if (t < 0.0) t = 0.0;
m_OutputImageR[i][k] = (unsigned char)m_InputImageR[i][k] * (t / 255);
m_OutputImageG[i][k] = (unsigned char)m_InputImageG[i][k] * (t / 255);
m_OutputImageB[i][k] = (unsigned char)m_InputImageB[i][k] * (t / 255);
}
}
}
평균값 이진화
void OnAverageBinary()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
long sum = 0;
for (int i = 0; i < m_height; i++)
for (int k = 0; k < m_width; k++)
sum += m_InputImageR[i][k] + m_InputImageG[i][k] + m_InputImageB[i][k];
int avr = (double)sum / (double)(m_height * m_width) / 3.0;
int a;
for (int i = 0; i < m_height; i++) {
for (int k = 0; k < m_width; k++) {
a = (m_InputImageR[i][k] + m_InputImageG[i][k] + m_InputImageB[i][k]) / 3.0;
if (avr > a) {
m_OutputImageR[i][k] = 0;
m_OutputImageG[i][k] = 0;
m_OutputImageB[i][k] = 0;
}
else {
m_OutputImageR[i][k] = 255;
m_OutputImageG[i][k] = 255;
m_OutputImageB[i][k] = 255;
}
}
}
}
이미지 이동
void OnMoveImage()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
CTWOQ dlg;
if (dlg.DoModal() != IDOK) return;
int x = (int)dlg.m_value1;
int y = (int)dlg.m_value2;
for(int i=0;i<m_Re_height;i++)
for (int k = 0; k < m_Re_width; k++) {
if ((0 <= x + k && x + k < m_Re_height) &&
(0 <= y + i && y + i < m_Re_width)) {
m_OutputImageR[i + y][k + x] = m_InputImageR[i][k];
m_OutputImageG[i + y][k + x] = m_InputImageG[i][k];
m_OutputImageB[i + y][k + x] = m_InputImageB[i][k];
}
}
}
이미지 좌우반전
void OnMirrorLr()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[i][m_Re_width - k - 1];
m_OutputImageG[i][k] = m_InputImageG[i][m_Re_width - k - 1];
m_OutputImageB[i][k] = m_InputImageB[i][m_Re_width - k - 1];
}
}
이미지 상하반전
void OnMirrorUd()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[m_Re_height -1 -i][k];
m_OutputImageG[i][k] = m_InputImageG[m_Re_height - 1 - i][k];
m_OutputImageB[i][k] = m_InputImageB[m_Re_height - 1 - i][k];
}
}
이미지 상하좌우반전
void OnMirror()
{
// TODO: 여기에 구현 코드 추가.
if (m_InputImageR == NULL)
return;
// *중요* 출력영상의 크기 결정 --> 알고리즘에 따름..
freeOutputImage(m_old_Re_height);
m_old_Re_height = m_Re_height = m_height;
m_old_Re_height = m_Re_width = m_width;
// 출력 이미지 메모리 할당
m_OutputImageR = malloc2D(m_Re_height, m_Re_width);
m_OutputImageG = malloc2D(m_Re_height, m_Re_width);
m_OutputImageB = malloc2D(m_Re_height, m_Re_width);
// **** 진짜 영상 처리 알고리즘 ***
for (int i = 0; i < m_Re_height; i++)
for (int k = 0; k < m_Re_width; k++) {
m_OutputImageR[i][k] = m_InputImageR[m_Re_height - 1 - i][m_Re_width - k - 1];
m_OutputImageG[i][k] = m_InputImageG[m_Re_height - 1 - i][m_Re_width - k - 1];
m_OutputImageB[i][k] = m_InputImageB[m_Re_height - 1 - i][m_Re_width - k - 1];
}
}
'영상처리' 카테고리의 다른 글
컬러 모델 (0) | 2021.06.20 |
---|---|
디지털 영상처리 입문 (0) | 2021.06.20 |
opencv 와 영상처리 동영상 (0) | 2020.09.09 |
파이썬 영상처리 요약본 (0) | 2020.08.30 |
영상처리 mfc 전체 코드 (0) | 2020.08.07 |