비트 맵
비트 맵 (BMP)은 본질적으로 픽셀 색상을 나타내는 숫자의 배열입니다. 예를 들어
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
무손실 압축
이제 압축 구성표를 정의하겠습니다. 압축 체계에는 숫자 쌍 배열이 있습니다. 예 :
3, 1, 1, 0, 7, 1
이제 제가 지적하고자하는 첫 번째 것은이 압축 체계가 첫 번째 배열과 동일한 픽셀을 나타냅니다. 첫 번째 배열에는 3 개의 1과 단일 0, 그리고 7 개의 1이 있습니다. 그리고 그것이 우리가 여기서 대표하는 것입니다. 이 형식은 두 개의 숫자가있는 여러 픽셀을 나타내므로 더 짧습니다. 비트 맵 형식은 각 픽셀마다 하나의 숫자를 사용해야합니다.
분명히 이것은 이미지 (예를 들어 단 하나의 행)와 압축 방식의 다소 단순화 된보기입니다. 그러나 이것이 압축 체계가 이미지의 형식을 어떻게 바꾸는 지 알 수 있기를 바랍니다. GIF가 BMP와 관련되는 방식입니다. GIF는 이 단순한 방법 대신 Lempel-Ziv-Welch 라는 압축 구성표를 사용합니다 .
여기에 설명 된 것은 무손실 압축 방식입니다. 무손실 압축 방식의 문제점은 일부 입력의 경우 인코딩 된 형식이 원본보다 길 수 있다는 것입니다. 예를 들어
1, 0, 1, 0, 1
인코딩은
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
글쎄, 그건 쓸모가 없었습니다. 입력을 두 배로 늘 렸습니다.
또 다른 무손실 압축
이제 다른 압축 체계를 생각해 봅시다. 이 이미지에서는 이미지를 중첩 원으로 표시합니다. 각 원에 대해 중심, 반경 및 색상을 정의합니다.
첫 번째 비트 맵은
5, 5, 1, 3, 0, 0
이것은 첫 번째 압축 방법과 길이가 같습니다.
그리고 우리의 두 번째는
2, 2, 1, 2, 1, 0, 2, 0, 1
이것은 중간 요소를 중심으로 한 3 개의 원입니다 (컴퓨터는 0부터 계산을 시작하므로 컴퓨터 계산은 2 번입니다). 하나의 원은 반지름 2와 색 1을가집니다. 그런 다음 우리는 원 0과 반지름 1의 원을 추가합니다. 마지막으로, 우리는 원의 색 1과 반지름 0을가집니다.
1, 1, 1, 1, 11
, 0, 0, 0,
11, 0, 1, 0, 1
또는
2, 2, 1, 1, 0, 0, 3, 0, 0
이것은 동일한 초기 원이지만 두 개의 점 원으로 덮여 있습니다. 단계적으로는
1, 1, 1, 1, 11
, 0, 1, 1,
11, 0, 1, 0, 1
둘 다 첫 번째 인코딩 된 버전보다 짧지 만 여전히 원본보다 깁니다.
내가 왜 범위가 아닌 서클에 대해 이야기하는지 궁금 할 것입니다. 주된 이유는 원이 실제 2 차원 이미지가 사용하는 것에 더 가깝기 때문입니다.
손실 압축
또한 손실 압축 방식이라는 개념이 있습니다. 이러한 무손실 압축 방식은 원래 비트 맵 배열로 다시 전환 할 수 있습니다. 손실 압축 체계는 되돌릴 수 없습니다.
서클 방식의 손실 버전을 고려해 보겠습니다. 여기에서는 간단한 규칙을 사용합니다. 반지름이 1보다 작은 원은 저장하지 않습니다. 따라서 마지막 두 인코딩에서는
2, 2, 1, 2, 1, 0
과
2, 2, 1
다시 픽셀로 변환 된
1, 0, 0, 0, 1
과
1, 1, 1, 1, 1
첫 번째 버전은 원본보다 한 요소 만 더 깁니다. 두 번째 버전은 더 짧습니다. 둘 다 유효하므로 알고리즘은 자유롭게 개발하고 더 짧은 것을 선택할 수 있습니다.
규칙이 더 엄격한 이미지는 품질이 낮은 것으로 설명합니다.
이미지를 겹쳐진 원형 도형 모음으로 표현하는 것은 Joint Photographic Experts Group 또는 JPEG 형식의 작동 방식과 유사 합니다. 모양은 원이 아닌 타원이지만 아이디어는 비슷합니다. 단순한 방법 대신 이산 코사인 변환 을 사용하여 이미지를 인코딩합니다.
GIF와 달리 JPEG는 실제로 이미지를 나타내는 다른 방법입니다. GIF는 여전히 픽셀입니다. 그들은 다른 방식으로 저장됩니다. JPEG는 도형입니다. JPEG를 보려면 화면이 작동하는 방식이므로 셰이프를 픽셀로 변환합니다. 이론적으로는 이런 방식으로 작동하지 않는 화면을 개발할 수있었습니다. 픽셀 대신 JPEG 형식에 더 잘 맞도록 모양을 만들 수 있습니다. 물론이 화면에는 비트 맵이 표시되지 않습니다. BMP 또는 GIF를 표시하려면 JPEG로 변환해야합니다.
300x300 픽셀과 같은 표준 GIF를 변환하고 JPEG로 변환 한 다음 품질을 떨어 뜨리면 사용하는 기본 모양이 표시되어야합니다. 많은 JPEG는 훨씬 높은 해상도 이미지로 시작하여 이러한 아티팩트를 피합니다.
JPEG는 픽셀이 아닌 모양이기 때문에 잘 확장됩니다. 따라서 8000x8000 이미지로 시작하여 JPEG로 변환 한 다음 300x300 이미지로 표시하면 손실 된 세부 정보가 대부분 손실됩니다. 8000x8000 비트 맵을 먼저 300x300 비트 맵으로 변환 한 다음 JPEG로 변환하면 결과 품질이 떨어질 수 있습니다.
MPEG
우리는 스틸 이미지에 대해 이야기하고 있습니다. 동화상 전문가 그룹 또는 MPEG 형식은 JPEG로 압축 같은 종류를 사용하지만, 그것은 또한 다른 작업을 수행. 비디오를 수행하는 간단한 방법은 스틸 이미지 시퀀스를 전송하는 것이지만 MPEG는 실제로 프레임을 전송 한 다음 변경 사항을 나열하고 끝 프레임으로 마무리하는 몇 개의 프레임을 전송합니다. 대부분의 프레임은 이전 프레임과 유사하기 때문에 변경 목록이 종종 두 번째 이미지보다 작습니다.
시퀀스는 일반적으로 그리 길지 않습니다 (5 프레임). 그러나 스트림을 다른 것보다 작게 만듭니다.
단순화
나는 많은 것을 무시했다. 내 이미지에는 8 비트 이미지의 256 개가 아닌 32 비트 이미지의 4,294,967,296이 아닌 두 가지 색상 (1 비트) 만 있습니다. 8 비트 이미지의 경우에도 이미지에 대해 다른 팔레트를 선택할 수 있습니다. 따라서 동일한 시퀀스를 가진 두 개의 8 비트 비트 맵은 모양이 같지만 색상이 다른 이미지를 나타낼 수 있습니다.
내 이미지는 2 차원이 아닌 단일 행입니다. 대부분의 이미지에는 특정 행 크기가 저장되어 배열을 2 차원으로 만듭니다.
실제 인코딩을 전혀 나타내지 않았습니다. 그것들은 내가 사용한 단순한 것보다 훨씬 더 복잡합니다. 이 게시물의 인코딩을 설명하고 싶기 때문에이 작업을 수행했습니다. 나는 단일 답변으로 Lempel-Ziv가 더 복잡한 Lempel-Ziv-Welch 개선을 훨씬 덜 설명 할 수 있다고 확신하지 않습니다. 그리고 나는 푸리에 변환이 길이를 설명 할만큼 충분히 이해하지 못한다.
이것은 실제 이미지 처리의 단순화 된 버전입니다. 그러나 나는 교훈적인 목적을 위해 여전히 필수 포인트에 부딪히면서 더 복잡한 현실보다 이해하기 쉽다고 생각합니다.