개발새발
Image Blur(CPU) 본문
이미지 비트 깊이
이미지의 비트 깊이는 각 픽셀이 표현할 수 있는 색상의 수를 결정한다. 비트 깊이에 따라 이미지의 표현력이 달라지며, 이는 파일 크기와도 직접적인 관련이 있다.
1비트 이미지
- 특징: 검은색과 흰색 두 가지 색상으로만 이미지를 표현한다.
- 용도: 단순한 도형이나 아이콘, 바코드 등에서 주로 사용된다.
- RGB 구현: 각 픽셀은 RGB 값 중 모든 채널이 0(검은색) 또는 255(흰색)으로 설정된다.
8비트 이미지
- 특징: 흑백 그림을 기본으로 하지만 레어어(Rare) 모드를 통해 컬러도 표현할 수 있다.
- 용도: 간단한 그래픽, 아이콘, 간단한 애니메이션 등에 사용된다.
- RGB 구현: 각 픽셀은 256단계(0~255)의 그레이스케일 값을 가진다. 컬러의 경우, 특정 색상 팔레트를 사용하여 제한된 색상을 표현할 수 있다.
16비트 이미지
- 특징: 더 섬세한 색상 표현이 가능하며, 그레이스케일과 컬러 모두에서 더 많은 디테일을 제공한다.
- 용도: 중간 수준의 그래픽 작업, 일부 게임 그래픽, 고해상도 이미징 등에 사용된다.
- RGB 구현: 각 색상 채널(R, G, B)이 16단계(0~65535)의 값을 가질 수 있어 더 정교한 색상 표현이 가능하다.
이미지 블러 기법
이미지 블러는 주위 픽셀과 유사한 색상으로 현재 픽셀을 뭉개어 이미지를 부드럽게 만드는 효과를 말한다. 다양한 블러 기법이 있으며, 각기 다른 용도로 사용된다.
Gaussian Blur
- 설명: 가우시안 함수를 적용하여 이미지를 부드럽게 만든다.
- 특징: 자연스러운 흐림 효과를 제공하며, 가장 많이 사용되는 블러 기법 중 하나이다.
- 용도: 사진 보정, 노이즈 제거, 배경 흐림 처리 등에 사용된다.
Box Blur
- 설명: 각 픽셀 주변의 사각형 영역 내 픽셀들을 평균내어 블러를 적용한다.
- 특징: 구현이 간단하고 계산 속도가 빠르다.
- 용도: 실시간 그래픽 처리, 간단한 이미지 필터링 등에 사용된다.
Motion Blur
- 설명: 노출 시간 동안 카메라가 움직인 효과를 시뮬레이션한다.
- 특징: 움직임의 방향과 속도를 표현할 수 있다.
- 용도: 스포츠 사진, 동적 장면 표현, 영화 효과 등에 사용된다.
블러 크기 설정 (BLUR_SIZE)
- 설명: 블러 연산에 포함될 픽셀의 수를 결정한다.
- 예시: BLUR_SIZE가 5인 경우, 현재 픽셀 위치가 (10, 10)이라면 (5, 5)부터 (15, 15)까지의 11x11 픽셀을 평균내어 블러를 적용한다.
- 효과: 블러의 강도를 조절할 수 있으며, 큰 BLUR_SIZE는 더 부드러운 흐림 효과를 제공한다.
이미지 포맷
이미지 포맷은 이미지 데이터를 저장하고 전송하는 방법을 정의한다. 주요 포맷으로는 JPEG와 PPM이 있으며, 각기 다른 특징과 용도를 가지고 있다.
JPEG
- 설명: 이미지 파일 크기를 줄이기 위해 압축된 포맷이다.
- 특징: 가장 일반적으로 사용되는 이미지 포맷 중 하나로, 24비트 컬러를 지원한다.
- 용도: 웹 이미지, 사진 저장, 디지털 카메라 등에서 널리 사용된다.
- 압축: 이미지의 해상도가 높을 경우 파일 크기가 매우 커지기 때문에 효율적인 압축을 통해 파일 크기를 줄인다.
PPM (Portable Pixmap)
- 설명: RGB 형태로 이미지를 저장하는 포맷으로, 텍스트 또는 바이너리 형태로 저장할 수 있다.
- 특징: 간단한 구조로 인해 이미지 처리 및 테스트에 자주 사용된다.
- 용도: 개발 및 테스트 환경, 간단한 이미지 저장 등에 사용된다.
- RGB 구현: 각 픽셀은 0~255 범위의 RGB 값을 가진다.
PPM 이미지 열기
PPM 이미지를 열기 위해서는 특정 뷰어가 필요하다. Linux 환경에서는 MobaXterm과 feh 명령어를 사용하여 PPM 이미지를 쉽게 열 수 있다.
MobaXterm과 feh 사용법
- MobaXterm 실행: Windows 환경에서 X11 서버와 터미널을 제공하는 MobaXterm을 실행한다.
- feh 명령어 사용: 터미널에서 feh 명령어를 사용하여 PPM 이미지를 연다.
$ feh image_name.ppm
- feh: feh는 PPM 이미지를 포함한 다양한 이미지 포맷을 지원하는 간편한 이미지 뷰어이다.
$ feh image_name.ppm
X Window Forwarding
X Window Forwarding은 원격 머신에서 실행되는 그래픽 애플리케이션을 로컬 머신에서 표시할 수 있도록 하는 X Window System(X11)의 기능이다. 이를 통해 원격 데스크탑 환경이나 개별 애플리케이션을 로컬에서 마치 로컬에서 실행되는 것처럼 상호작용할 수 있다.
주요 특징
- 원격 실행: 애플리케이션이 실제로는 원격 서버에서 실행되지만, 로컬 머신에서 그래픽 인터페이스를 통해 접근할 수 있다.
- 보안: SSH와 결합하여 안전하게 그래픽 데이터를 전송할 수 있다.
- 유용성: 서버 관리, 원격 개발 환경, 그래픽 애플리케이션 테스트 등에 유용하다.
사용 방법
- SSH 접속 시 X11 포워딩 활성화:
- 원격 애플리케이션 실행:
$ feh image_name.ppm
ssh -X user@remote_host
원격 애플리케이션의 그래픽 인터페이스가 로컬 머신에 표시된다
#include <iostream>
#include "ppm.h"
#include "clockMeasure.h"
#define BLUR_SIZE 5
using namespace std;
const int MAX_ITER = 10;
void cpuCode(unsigned char* outArray, const unsigned char* inArray, const int w, const int h) {
// Exercise: Write image blur
}
int main() {
int w, h;
unsigned char* h_imageArray;
unsigned char* h_outImageArray;
// This function will load the R/G/B values from a PPM file into an array and return the width (w) and height (h).
ppmLoad("./data/ewha_picture.ppm", &h_imageArray, &w, &h);
clockMeasure* ckCpu = new clockMeasure("CPU CODE");
ckCpu->clockReset();
for (int i = 0; i < MAX_ITER; i++) {
ckCpu->clockResume();
cpuCode(h_outImageArray, h_imageArray, w, h);
ckCpu->clockPause();
}
ckCpu->clockPrint();
// This function will store the R/G/B values from h_outImageArray into a PPM file.
ppmSave("ewha_picture_cpu.ppm", h_outImageArray, w, h);
return 0;
}
- 주요 함수:
- ppmLoad 함수: PPM 파일에서 RGB 값을 불러와 h_imageArray 배열에 저장
- cpuCode 함수: 블러링 알고리즘을 구현하는 부분으로, BLUR_SIZE를 설정하여 블러링 연산에 사용할 픽셀 범위를 지정. outArray는 블러링 결과를 저장하며, inArray는 원본 이미지의 RGB 값을 저장하는 배열
- inArray 배열은 R/G/B 값을 3개 각각 ewha_picture.ppm에 저장
- 이 배열은 1차원 배열 형태로, RGB 값이 순서대로 저장됨. 예를 들어, 첫 번째 픽셀의 R, G, B 값이 inArray[0], inArray[1], inArray[2]에 저장되고, 다음 픽셀의 RGB 값은 그 다음 인덱스에 이어서 저장됨
- ppmSave 함수: 블러링된 결과를 PPM 형식으로 저장
- BLUR_SIZE 매크로: 블러링 연산에 포함되는 픽셀의 범위를 결정. 예를 들어, BLUR_SIZE가 5일 경우, 현재 픽셀 위치를 기준으로 가로와 세로로 각각 5픽셀의 범위를 포함한 11x11 크기의 영역 내에서 평균을 계산해 블러링을 수행
'임베디드시스템' 카테고리의 다른 글
GPUs vs DNN Accelerators (1) | 2024.10.24 |
---|---|
Image Blur (GPU) (0) | 2024.10.23 |
GPU (0) | 2024.10.02 |
CUDA (0) | 2024.09.26 |
Professor (0) | 2024.09.25 |