공부를 할수록 세상이 넓게 보여요
이 글의 목적은 차원축소를 해주는 SVD, PCA 등 통계학 이론을 적용해서 실제로 사자의 얼굴을 그리는 과정을 보여줍니다.
픽셀(Pixel)은 디지털 이미지의 가장 기본적인 단위로, 화면에 다양한 색상을 표현하는 핵심 요소입니다. 픽셀의 구성과 색상 표현 방식을 구체적으로 설명드리겠습니다.
1. 픽셀의 기본 구성
정의: 픽셀은 "Picture Element"의 약자로, 디지털 이미지를 구성하는 가장 작은 단위입니다.
크기: 픽셀의 크기는 화면 해상도에 따라 달라집니다. 예를 들어, 1920x1080 해상도의 화면은 가로 1920개, 세로 1080개의 픽셀로 구성됩니다.
형태: 각 픽셀은 작은 사각형 모양이며, 이들이 모여 전체 이미지를 형성합니다.
사진인용
#000 How to access and edit pixel values in OpenCV with Python?
https://blog.naver.com/techref/223776344026?trackingCode=rss
픽셀은 빛의 삼원색(Red, Green, Blue, RGB)을 조합하여 다양한 색상을 표현합니다. 주요 원리는 다음과 같습니다:
기본 원리: 각 픽셀은 빨간색(R), 초록색(G), 파란색(B)의 세 가지 색광을 조합하여 색상을 만듭니다.
색상 조합: 각 색광의 강도(0~255)를 조절하여 다양한 색상을 표현합니다. 예를 들어, R:255, G:0, B:0 → 빨간색 R:0, G:255, B:0 → 초록색 R:0, G:0, B:255 → 파란색 R:255, G:255, B:255 → 흰색
구성: 각 픽셀은 R, G, B 서브픽셀로 나뉘며, 이들이 모여 하나의 픽셀을 형성합니다.
작동 원리: 서브픽셀의 밝기를 조절하여 전체 픽셀의 색상을 결정합니다. 예를 들어, 빨간색을 표현하려면 R 서브픽셀의 밝기를 최대로 하고, G와 B 서브픽셀의 밝기를 최소로 합니다.
입력: 그래픽 카드에서 전달된 RGB 데이터를 화면에 표시합니다.
변환: 각 픽셀의 RGB 값을 서브픽셀의 밝기로 변환합니다.
출력: 서브픽셀의 밝기가 조합되어 화면에 최종 색상을 표현합니다.
비트 깊이: 각 색광(R, G, B)의 강도를 표현하는 비트 수를 비트 깊이라고 합니다. 예를 들어, 8비트는 256단계(0~255)의 강도를 표현할 수 있습니다.
색상 수: 8비트 RGB 모델은 256x256x256 = 약 1677만 가지의 색상을 표현할 수 있습니다.
해상도와 색상: 해상도가 높을수록 픽셀 수가 증가해 더 선명한 이미지를 제공하며, 비트 깊이가 높을수록 더 풍부한 색상을 표현할 수 있습니다.
오른편 칼라판 사자머리 사진에서 이미지의 픽셀 데이터를 추출하고, 픽셀의 크기와 색상 정보를 확인하는 Python 코드를 만들었고 다음은 그 결과 중 일부입니다. (코드가 길어서 다 보여드릴 수가 없네요)
이미지 크기: 533x800
픽셀 픽셀 배열 형태: (800, 533, 3)
(100, 100) 위치의 픽셀 색상 (R, G, B): [152 113 84]
(0, 0) 위치의 픽셀 색상 (R, G, B): [109 93 78]
(1, 0) 위치의 픽셀 색상 (R, G, B): [108 92 77]
(2, 0) 위치의 픽셀 색상 (R, G, B): [106 90 75]
(중략)
(91, 703) 위치의 픽셀 색상 (R, G, B): [15 6 1]
(92, 703) 위치의 픽셀 색상 (R, G, B): [21 10 4]
(93, 703) 위치의 픽셀 색상 (R, G, B): [21 10 4]
너무 길어 더 이상 프린트를 못하는데, 함..
(x, y) 좌표로 93, 703의 3색은 (R, G, B): [21 10 4]
그러면 [21 10 4]는 무슨 색일까요?라고 파이썬에 물으면
import matplotlib.pyplot as plt
plt.figure(figsize=(2,2))
plt.imshow([[[21/255, 10/255, 4/255]]])
plt.axis('off')
plt.title('RGB [21, 10, 4]')
plt.show()
[21, 10, 4] 검은색인데 순수 100% 검정이 아니라 빨간색(21/255), 녹색 (10/255), 파란색(4/255)이 혼합된 색이다.
참고로 이 사이트를 방문하면 255개 전체 코드를 볼 수 있어요.
https://hexa-coding.tistory.com/34
https://monica.im/home/memo/6b9b780e-1398-4d6f-b8c2-6ea9e105feb5
다음은 위의 이미지 처럼, 참새를 흑백으로 전환해서 PIXEL 칼라를 만든 후(칼라 조합이 너무 많아져서 의도적으로 축 초하려는 목적) , 이 색상코드를 모눈종이 좌표에 표시를 한 결과입니다. (1,2)=흰색, (100,100)= 회색을 표시했는데 이것이 결국 새 모양처럼 바뀐 거죠....
SVD를 이용하면 PIXEL 중 가령 40%의 중요원소 s로 100% 그림과 유사한 그림을 만들 수 있고 하는데, SVD가 뭔지, 어떻게 s를 축출하는지, 그리고 어떤 원리로 일부의 픽셀만으로 원래 그림을 복원하는지 이론적으로 매우 궁금해요.
SVD(Singular Value Decomposition, 특이값 분해)는 선형대수학에서 매우 중요한 개념으로, 통계학, 인공지능, 이미지 처리 등 다양한 분야에서 활용됩니다. 특히 이미지 압축, 노이즈 제거, 데이터 차원 축소 등의 작업에 사용됩니다. 아래에서 SVD의 개념, 원리, 그리고 픽셀 데이터를 이용한 이미지 복원 과정을 자세히 설명드리겠습니다.
SVD는 행렬을 세 개의 행렬로 분해하는 방법입니다. 임의의 행렬 AA (m×n 크기)는 다음과 같이 분해됩니다:
A=UΣVTA=UΣVT
여기서:
UU: m×m 크기의 직교 행렬 (left singular vectors)
ΣΣ: m×n 크기의 대각 행렬 (singular values, 특이값)
VTVT: n×n 크기의 직교 행렬 (right singular vectors)
특이값 ΣΣ는 행렬 AA의 중요한 정보를 포함하며, 큰 값부터 작은 값으로 정렬됩니다.
이미지는 픽셀 값으로 구성된 행렬로 표현할 수 있습니다. SVD를 사용하여 이 행렬을 분해하고, 일부 특이값만 사용하여 이미지를 복원할 수 있습니다. 이 과정은 다음과 같습니다:
특이값의 중요성: 큰 특이값은 이미지의 주요 정보(예: 구조, 윤곽)를 포함하고, 작은 특이값은 세부 정보(예: 노이즈)를 포함합니다.
데이터 압축: 큰 특이값만 사용하면 데이터 크기를 줄이면서도 원본 이미지와 유사한 결과를 얻을 수 있습니다.
차원 축소: 불필요한 정보를 제거하여 계산 효율성을 높입니다.
원래 가운데 있는 칼러사진을 왼편의 흑백사진으로 변환한 후, 800*533의 PIXEL을 가지게 된다.
원본 이미지 데이터(A): 533 ×800 = 426,400개 (RGB 채널 무시 시)
특이값(S) k=213개의 스칼라 값 → 213개
왼쪽 특이벡터(U) 행 수 = 533, k = 213 → 533 × 213 행렬 총 요소 수: 533 × 213 = 113,529개
오른쪽 특이벡터(V^T) k = 213, 열 수 = 800 → 213 × 800 행렬 총 요소 수: 213 × 800 = 170,400개
총 사용된 데이터(B): 284,142개 (=213+113,529+170,400)
사용픽셀 부분 B/A= 66.6% 즉 원본의 67% 픽셀만 사용해서 원본이미지를 복원을 했음.
k=213이란 표현이 아직도 이해가 되지 않죠?
k라는 숫자가 늘어나면서 눈도 보이고, 코도 보이고, 입도 더 잘 보이고 하면서 진화를 하는 거예요...
오늘 많은 용어들을 이해하느라 힘드셨죠? 오늘 SVD를 사용하면 일부 픽셀 데이터만으로도 원본 이미지를 복원할 수 있는데, 이는 특이값이 이미지의 주요 정보를 포함하고 있기 때문 입이다 정도만 이해하셔도 다행입니다. 결론적으로 SVD는 선형대수학의 핵심 개념으로, 행렬의 구조와 특성을 분석하는 데 유용합니다. 이를 통해 데이터의 중요한 정보를 추출하고, 불필요한 정보를 제거할 수 있습니다.
오늘은 DeepSeek V3가 도움을 주셨습니다.