이미지 표현 및 채널 번호 문제, 사진 읽기 및 표시, cv2.imread(filename, flags=None)

이미지 표현 및 채널 수

디지털 이미지의 기본 개념

디지털 이미지의 경우 우리가 보는 것은 육안으로 볼 수 있는 실제 사진이지만 컴퓨터에게 이 이미지는 밝기가 다른 점들의 집합일 뿐입니다. M×N 크기의 영상은 M×N의 행렬로 나타낼 수 있으며, 행렬 요소의 값은 이 위치에 있는 픽셀의 밝기를 나타내며, 일반적으로 픽셀 값이 클수록 포인트가 밝아진다.

일반적으로 그레이스케일 영상은 2차원 행렬로 표현되고 컬러(다채널) 영상은 3차원 행렬(M×N×3)로 표현된다.

————————————————————————————————————————

채널 수

단일 채널
일반적으로 회색조 이미지로 알려진 각 픽셀은 색상을 나타내는 하나의 값만 가질 수 있으며 픽셀 값은 0에서 255 사이이며 0은 검정, 255는 흰색입니다. 그레이스케일 이미지는 RGB의 3가지 성분을 일정한 비율에 따라 계산하여 얻은 단일 채널 이미지이며 중간에 약간의 다른 그레이 레벨이 있습니다. 그레이 스케일은 검정과 흰색 사이의 과도기적 색상이라고 할 수 있으며
, 설명하자면 단일 채널입니다. 회색조 이미지와 이진화 이미지는 모두 단일 채널 이미지입니다.
2 8 2^{8}28 =22 2^{2}22(비) *2 3 2^{3}23 (지) *2 3 2^{3}23 (R)
총 256가지 색상 표시
값 범위: 0~255

  • 그레이스케일 이미지의 비트 심도는 1*8=8입니다.
  • 이진화된 이미지의 비트 심도는 1*1=1입니다.

3개의 채널
은 RGB 3색이며, 각 픽셀은 (RGB)를 나타내는 3바이트(1바이트는 8비트)를 가지며, 최대 값 범위는 0~255입니다. 2 24 2^{ 24
}224 =28 2^{8}28(비) *2 8 2^{8}28(지) *2 8 2^{8}28 (R)
따라서 RGB 각 요소의 값 범위는 0~255입니다.
그러면 세 가지 색상의 조합은 256 * 256 * 256 = 16777216이 되고 총 16777216가지 색상이 표시됩니다
값 범위: 0~16777215
3채널이 가장 많이 사용되는 그림입니다. 3채널 맵은 각 픽셀에 3개의 값이 표시됨을 의미합니다. 비트 심도=3*8=24.

4채널
및 4채널 이미지, 즉 R, G, B에 A 채널이 더해져 투명도를 나타냅니다. 일반적으로 투명도를 의미하는 알파 채널이라고 합니다.
2 32 2^{32}232 = 알파 투명도 +2 8 2^{8}28(비) *2 8 2^{8}28(지) *2 8 2^{8}28 (R)
4채널 이미지는 각 픽셀에 4개의 값 표현(비트 심도=4*8=32)이 있음을 의미합니다.
PNG는 RGBA를 사용하는 이미지 형식입니다.

이진 이미지 이진
이미지의 의미는 각 이미지의 각 픽셀이 0 또는 255만 사용할 수 있다는 것입니다. 여기서 0은 검은색이고 255는 흰색, 즉 검은색 또는 흰색입니다. 컬러 이미지를 그레이스케일로 변환하여 출력합니다.
비트 심도는 1이며, 이는 각 픽셀이 1비트, 즉 1 또는 0으로 표현됨을 의미합니다.

채널 번호 간 변환

# 高通道数向低通道数转化
img_gray=img.convert('L')  # 将四通道或三通道图片转化为灰度图
img_white=img.convert('1') # 将四通道,三通道,灰度图转化为二值化图片
#低通道数向高通道数转化,主要涉及到灰度图向RGB的转化。

# 灰度图向三通道图的转化注意这里输出的图片依然是灰色的,但是位深度已经达到24.
img_color=img_gray.convert('RGB') 

————————————————————————————————————————

그런 다음 이미지가 저장되는 방법, 심지어 인코딩되는 방법에 대해 이야기해 보겠습니다.
단일 채널 이미지, 즉 회색조 이미지인 경우 각 픽셀 값은 아래와 같이 8비트 바이너리를 사용할 수 있습니다.
여기에 이미지 설명 삽입

그 중 I(ij)는 i행 j열의 밝기 값을 나타낸다.

RGB 이미지와 같은 다중 채널 이미지인 경우 각 픽셀은 3바이트로 표현됩니다. OpenCV에서 RGB 이미지의 채널 순서는 BGR이며 저장소는 다음 그림과 같습니다.
여기에 이미지 설명 삽입

원본 링크: https://blog.csdn.net/mao_hui_fei/article/details/78217049

————————————————————————————————————————

이미지 읽기 및 표시

cv2.imread 매개변수 소개
cv2.imread(filename, flags=None)

파일 이름: './xxx.png'와 같은 이미지 주소

flags: 읽은 데이터의 형식을 나타내는 플래그 비트

  • -1: 원본 이미지. 읽은 이미지의 원래 색상 채널을 유지합니다. IMREAD_UNCHANGED와 동일
  • 0: 그레이스케일 이미지. IMREAD_GRAYSCALE과 동일
  • 1: 컬러 맵. 이미지의 투명도는 무시되며 이것이 기본 매개변수입니다. IMREAD_COLOR와 동일

아래와 같이 코드 쇼:

# 引入包
import cv2 as cv

img = cv.imread("./static/image/blur.jpg")
#Mat imread(const String& filename,int flags);  读取图片
# 第一个参数是图片地址:“\”"\\"和"/" "//"   无论正反,单双python2.7实测没影响
# 第二个参数是图片读取方式:默认正常读取,如果为0 则为 灰度图

cv.namedWindow("Image", 0)
# cv.NamedWindow( const char* name, int flags );
# 创建窗口,其实不写这行代码也可以show出来。
#  第一个参数是窗口名字,尽量使用英文命名,中文会出现乱码
# 第二个参数是窗口显示方式, 为0或cv.WINDOW_NORMAL:可以改变窗口大小,不写或cv.WINDOW_AUTOSIZE则不可改变大小

cv.imshow('Image', img)
# mshow(const string& winname, InputArray mat) 显示图片窗口
# 第一个参数:窗口名称。如果上面有NamedWindow()函数,这个名称要与它一样,不然会出现两个窗口,一个是NamedWindow的空白窗口,一个是imshow的图片窗口。
# 第二个参数:要显示的图片。
# 如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度

cv.waitKey(5000)
# waitKey(K) 窗口显示时间,单位:毫秒
# k=0: (也可以是小于0的数值)一直显示,键盘上按下一个数字键即会消失
# k>0:显示多少毫秒

cv.destroyAllWindows() # 删除建立的全部窗口,释放资源

결과 표시:
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/weixin_33538887/article/details/126478280