강의자료 · 로봇기초실습

Python으로 영상과 색 다루기

clear variables;

이미지 파일 처리

img_rgb = imread('Lenna.png');
disp('Display image')
Display image
imshow(img_rgb)
원본 RGB 샘플 영상. 모자를 쓴 인물과 깃털 장식이 붉은색 계열 배경 앞에 보입니다.

이미지 흑백화

img_gray = rgb2gray(img_rgb);
disp('Display grayscale image')
Display grayscale image
imshow(img_gray)
RGB 원본을 rgb2gray로 변환한 Grayscale 영상. 원본의 모자와 인물 윤곽이 명암으로 표시됩니다.

흑백 이미지 매트릭스 산술 연산

disp('Display brighter grayscale image')
Display brighter grayscale image
imshow(img_gray+100)
Grayscale 영상에 100을 더해 표시한 결과. 원본보다 밝으며 모자와 얼굴의 밝은 영역이 흰색에 가깝게 보입니다.

RGB 이미지 각 채널 분리

r = img_rgb(:, :, 1);
g = img_rgb(:, :, 2);
b = img_rgb(:, :, 3);
disp('Display r-channel grayscale image')
Display r-channel grayscale image
imshow(r)
RGB 영상의 R 채널을 Grayscale로 표시한 결과.
disp('Display g-channel grayscale image')
Display g-channel grayscale image
imshow(g)
RGB 영상의 G 채널을 Grayscale로 표시한 결과.
disp('Display b-channel grayscale image')
Display b-channel grayscale image
imshow(b)
RGB 영상의 B 채널을 Grayscale로 표시한 결과.

RGB 이미지 매트릭스 산술 연산

img_rgb_r = img_rgb;
img_rgb_g = img_rgb;
img_rgb_b = img_rgb;
img_rgb_r(:, :, 1) = img_rgb_r(:, :, 1) + 100;
img_rgb_g(:, :, 2) = img_rgb_g(:, :, 2) + 100;
img_rgb_b(:, :, 3) = img_rgb_b(:, :, 3) + 100;
disp('Display r-channel reinforced image')
Display r-channel reinforced image
imshow(img_rgb_r)
원본 RGB 영상의 R 채널에 100을 더한 결과. 영상 전체에 붉은색 기운이 강하게 나타납니다.
disp('Display g-channel reinforced image')
Display g-channel reinforced image
imshow(img_rgb_g)
원본 RGB 영상의 G 채널에 100을 더한 결과. 영상 전체에 초록색·노란색 기운이 강하게 나타납니다.
disp('Display b-channel reinforced image')
Display b-channel reinforced image
imshow(img_rgb_b)
원본 RGB 영상의 B 채널에 100을 더한 결과. 영상 전체에 파란색·보라색 기운이 강하게 나타납니다.

RGB 이미지 매트릭스 요소 연산

img_rgb_1 = img_rgb;
img_rgb_1(1:256, 1:256, 1) = 255; % 2사분면, R채널
img_rgb_1(1:256, 256:end, 2) = 255; % 1사분면, G채널
img_rgb_1(256:end, 256:end, 3) = 255; % 4사분면, B채널
disp('Display element-wise edited image')
Display element-wise edited image
imshow(img_rgb_1)
영역별 RGB 값을 바꾼 영상. 왼쪽 위는 R, 오른쪽 위는 G, 오른쪽 아래는 B 채널을 255로 설정했으며, 왼쪽 아래에는 원본 색이 남아 있습니다.

색 공간 변환 (RGB, HSV)

img_hsv = rgb2hsv(img_rgb);
disp('Display hsv transformed image')
Display hsv transformed image
imshow(img_hsv)
 
h = img_hsv(:, :, 1);
s = img_hsv(:, :, 2);
v = img_hsv(:, :, 3);
disp('Display h-channel grayscale image')
Display h-channel grayscale image
imshow(h)
HSV의 H 채널을 Grayscale로 표시한 영상. Hue 값에 따라 모자와 인물 영역이 어두운 부분과 밝은 부분으로 구분됩니다.
disp('Display s-channel grayscale image')
Display s-channel grayscale image
imshow(s)
HSV의 S 채널을 Grayscale로 표시한 영상. Saturation 값에 따라 모자와 인물의 경계가 서로 다른 명암으로 보입니다.
disp('Display v-channel grayscale image')
Display v-channel grayscale image
imshow(v)
HSV의 V 채널을 Grayscale로 표시한 영상. 모자와 얼굴은 밝게, 깃털 장식과 배경의 일부는 어둡게 보입니다.

HSV 공간에서 특정 색 영역 추출하기

Hue 색상표. 0–360° 눈금 위에 빨강·노랑·초록·청록·파랑·자홍색을 거쳐 다시 빨강으로 이어지는 띠가 있습니다.
img_h_cut_hsv = img_hsv.*(h>0.67).*(h<0.83); % purple
img_h_cut_rgb = hsv2rgb(img_h_cut_hsv);
disp('Display purple area of the image')
Display purple area of the image
imshow(img_h_cut_rgb)
HSV에서 0.67<h<0.83인 영역만 남겨 RGB로 변환한 영상. 영상 대부분은 검고 깃털 장식의 일부가 보라색으로 남아 있습니다.

이미지 변형하기

img_zoom_out = imresize(img_rgb, 0.5);
disp('Display 50% zoom out image');
Display 50% zoom out image
imshow(img_zoom_out)
원본을 imresize로 0.5배 축소해 표시한 RGB 영상. 모자와 인물의 가로·세로 비율을 유지합니다.
img_trans = imresize(img_rgb, [100 50]);
disp('Display transformed image');
Display transformed image
imshow(img_trans)
원본을 100행·50열로 변형한 RGB 영상. 가로 폭이 좁아져 모자와 인물이 세로로 길게 보입니다.
img_rotate1 = imrotate(img_rgb, 30);
disp('Display rotated image');
Display rotated image
imshow(img_rotate1)
원본을 30° 회전한 영상. 기울어진 영상이 잘리지 않도록 출력 범위가 커졌고 모서리에 검은 여백이 있습니다.
img_rotate2 = imrotate(img_rgb, 30, 'crop');
disp('Display rotated and cropped image');
Display rotated and cropped image
imshow(img_rotate2)
원본을 30° 회전하고 crop을 적용한 영상. 출력 크기는 유지되며 기울어진 영상의 바깥 부분이 잘립니다.
img_flip1 = flip(img_rgb, 1);
img_flip2 = flip(img_rgb, 2);
disp('Display vertically flipped image')
Display vertically flipped image
imshow(img_flip1)
flip(img_rgb,1)로 상하 반전한 RGB 영상. 모자와 인물이 위아래로 뒤집혀 보입니다.
disp('Display horizontally flipped image')
Display horizontally flipped image
imshow(img_flip2)
flip(img_rgb,2)로 좌우 반전한 RGB 영상. 원본의 왼쪽과 오른쪽이 바뀌어 보입니다.