본 글에서는 이미지의 특정부분을 잘라내기(Crop) 혹은 추출하여 이미지 프로세싱을 수행후
본래 이미지에 붙여넣기 하는 작업을 해보겠습니다.
자동으로 이미지상의 ROI (Region of Interest) 를 추출하여 연산을 수행하는것은 중급과정에서 다룰
예정입니다.
우선 위의 figure 창에서 임의로 선택한 특정부분을 잘라내기(Crop) 하여 새로운 변수로 지정하여
보겠습니다. 위의 이미지상에서 2개의 좌표 및 픽셀값 표시, 노란색 네모상자는 각각 figure 툴메뉴 중
Tools -> Data Cursor(+ new Data Cursor), Insert -> rectangle 을 이용하였습니다.
( 본 글의 상단에 있는 소개 동영상을 참조해 주세요. )
잘라내기(Crop) 할 좌표는 [x좌표, y좌표] 형식으로 [753, 1210] 부터 [2115, 2110] 까지 임의로
지정하였습니다. 여기에서 주의할 점은 MATLAB에서 이미지 데이터는 행 과 열을 갖는 하나의 데이터
매트릭스(matrix) 형태를 갖으므로 픽셀에 접근하기 위해 반드시 [ y좌표, x좌표 ] 순서로 지정하여야 합니다.
대상 이미지를 workspace에 불러들여 grayscale로 변환후 지정된 좌표를 이용하여 잘라내기(Crop) 를
하겠습니다.
위 이미지는 본 블로그 맨밑 출처 1에 가셔서 다운로드 받을 수 있습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
img_gray = rgb2gray(img);
start_pt = [753, 1210]; % [x, y]
end_pt = [2115, 2110]; % [x, y]
width = end_pt(1) - start_pt(1) + 1;
height = end_pt(2) - start_pt(2) + 1;
img_gray_crop = imcrop(img_gray, [start_pt(1), start_pt(2), width, height]); % [xmin ymin width height]
지정된 좌표의 시작점과 끝점은 각각 start_pt 와 end_pt 변수에
편의상 위의 figure에서 나타난것과 같은 순서 [x좌표, y좌표]로 지정 하였습니다.
잘라내기(Crop)한 새로운 이미지의 너비와 높이는 끝점과 시작점의 차이에 +1 픽셀을 더해야 합니다.
예를들어, 좌표 1에서 좌표 100 까지 지정한다면 길이는 100 이며, 이는 간단한 수식 (100 - 1) + 1 으로 표현됩니다.
이번에는 잘라내기한 새로운 이미지에 임의로 픽셀값의 70%를 상향시켜 보겠습니다.
단, 각각의 픽셀값에 70%를 상향시키는 작업이므로 element-wise 곱셈연산 (" .* ") 을 수행해야 합니다.
Python에 익숙하시다면 브로드캐스팅(Broadcasting) 연산을 기대하실 수 있지만
버그 발생요소를 제거하고, 원래의 연산의도를 충족하기 위해 element-wise 곱셈연산을 하겠습니다.
선형연산을 하기 전, 후를 비교하기 위해 histogram과 이미지를 나란히 표시하겠습니다.
img_gray_crop_UP = img_gray_crop .* 1.7; % intensity 70% UP
figure; % histograms
subplot(1,2,1); imhist(img_gray_crop); title('Original');
subplot(1,2,2); imhist(img_gray_crop_UP); title('Intensity 70% UP');
figure; % showing images
subplot(1,2,1); imshow(img_gray_crop); title('Original');
subplot(1,2,2); imshow(img_gray_crop_UP); title('Intensity 70% UP');
위의 histogram 에서 보듯이, 픽셀값 70% 상향시 픽셀값의 분포가 원래에 비해 우측으로 확장되었고,
이미지 또한 눈에띄게 밝아졌음을 알 수 있습니다. (이것은 이미지의 brightness 개선에 사용되는 기본적인
방법 입니다. [MATLAB 영상처리 기초 7] Contrass-Brightness-Gamma 참조)
만일 cell(세포)의 형태적 특징을 추출, 가공하는것이 이미지 프로세싱의 목적이고 그 외의 것들
(예를들어 배경이 되는 어두운 부분)을 노이즈로 가정 한다면, 이미지의 일괄적인 선형연산으로 인한
노이즈 증가를 예상할 수 있습니다.
마지막으로 본래 이미지의 잘라내기(Crop)한 부분을 픽셀값 70% 상향한 이미지 조각으로 대체해 보겠습니다.
이처럼 특정부분의 픽셀값을 상향하여 대체하는 작업은 보편적으로 수행하는 테크닉은 아닙니다.
원래 이미지의 사본 (여기서는 "img_gray2")을 만들고, 픽셀값을 대체할 부분의 범위지정에 주의하십시오.
결과 이미지와 본 글에서 쓰인 모든 코드와 변수들은 밑에 표시됩니다.
밑의 결과 이미지에서 알 수 있듯이 특정부분의 픽셀값만 70% 상향되었고 이로인해 특정부분만
눈에띄게 밝게 표현되고 있습니다.
마지막으로 본 글에 쓰인 모든 MATLAB 코드는 밑에 표시해 두었습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
img_gray = rgb2gray(img);
% set a range of cell and crop
start_pt = [753, 1210]; % [x, y]
end_pt = [2115, 2110]; % [x, y]
width = end_pt(1) - start_pt(1) + 1;
height = end_pt(2) - start_pt(2) + 1;
img_gray_crop = imcrop(img_gray, [start_pt(1), start_pt(2), width, height]); % [xmin ymin width height]
% increase pixel value 70% up on cropped image
img_gray_crop_UP = img_gray_crop .* 1.7; % intensity 70% UP
figure; % histograms
subplot(1,2,1); imhist(img_gray_crop); title('Original');
subplot(1,2,2); imhist(img_gray_crop_UP); title('Intensity 70% UP');
figure; % showing images
subplot(1,2,1); imshow(img_gray_crop); title('Original');
subplot(1,2,2); imshow(img_gray_crop_UP); title('Intensity 70% UP');
% replace the range with 70% up pixel value
img_gray2 = img_gray;
y_range = start_pt(2):end_pt(2)+1; % caution) +1 px is needed
x_range = start_pt(1):end_pt(1)+1; % caution) +1 px is needed
img_gray2(y_range,x_range) = img_gray_crop_UP;
figure; imshow(img_gray2);
출처1: https://unsplash.com/photos/jdfn7Z03Qa4
Published on September 7, 2021.6 Free to use under the Unsplash License
사진 작가: National Cancer Institute, Unsplash
Cells from cervical cancer – Splash에서 National Cancer Institute의 이 사진 다운로드
unsplash.com