MATLAB 영상처리 기초 - 화질향상 및 공간필터링

[MATLAB 영상처리 기초 4] 이미지의 픽셀값 다루기 - imcrop( ), 픽셀 intensity 증가

toyprojects 2023. 3. 5. 03:04

 

 

 

 

이미지의 특정영역 잘라내기, 픽셀 intensity 선형연산 소개 동영상

 

 

Cells from cervical cancer - National Cancer Institute (출처1)

 

 

본 글에서는 이미지의 특정부분을 잘라내기(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 (좌: Original, 우: Intensity 70% 상향)

 

Cropped Image (좌: Original, 우: Intensity 70% 상향)

 

 

위의 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