Problemas de representación de imágenes y número de canal, lectura y visualización de imágenes, cv2.imread(filename, flags=Ninguno)

Representación de la imagen y número de canales

Conceptos básicos de imágenes digitales

Para una imagen digital, lo que vemos es una imagen real visible a simple vista, pero para la computadora, esta imagen es solo un montón de puntos con diferente brillo. Una imagen con un tamaño de M × N se puede representar mediante una matriz de M × N. El valor del elemento de la matriz representa el brillo del píxel en esta posición. En términos generales, cuanto mayor sea el valor del píxel, más brillante será el punto.

En general, las imágenes en escala de grises se representan mediante matrices bidimensionales y las imágenes en color (multicanal) se representan mediante matrices tridimensionales (M × N × 3).

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

número de canales

Canal único
Comúnmente conocida como imagen en escala de grises, cada píxel solo puede tener un valor para representar el color, su valor de píxel está entre 0 y 255, 0 es negro, 255 es blanco. La imagen en escala de grises es una imagen de un solo canal que se obtiene calculando los tres componentes de RGB de acuerdo con una cierta proporción. Hay algunos niveles diferentes de gris en el medio. Se puede decir que la escala de grises es un color de transición entre el blanco y el negro
, para describirlo es un solo canal. Tanto las imágenes en escala de grises como las binarizadas son imágenes de un solo canal.
2 8 2^{8}28 =2 2 2^{2}22 (B) *2 3 2^{3}23 (G) *2 3 2^{3}23 (R)
Se muestra un total de 256 colores
Rango de valores: 0~255

  • La profundidad de bits de la imagen en escala de grises es 1*8=8.
  • La profundidad de bits de la imagen binarizada es 1*1=1.

Tres canales
son RGB de tres colores, cada píxel tiene 3 bytes (1 byte equivale a 8 bits) para representar (RGB), y el rango de valor máximo es de 0 a 255. 2 24 2^{ 24
}224 =2 8 2^{8}28 (B) *2 8 2^{8}28 (G) *2 8 2^{8}28 (R)
Entonces, el rango de valores de cada elemento de RGB es: 0~255.
Luego, la combinación de los tres colores es 256 * 256 * 256 = 16777216, y se muestra un total de 16777216 colores
Rango de valores: 0~16777215
La imagen de tres canales es la más utilizada. Un mapa de tres canales significa que cada píxel tiene tres valores representados. Profundidad de bits=3*8=24.

Imagen de cuatro canales
y cuatro canales, es decir, R, G, B más un canal A, lo que indica transparencia. Generalmente llamado canal alfa, lo que significa transparencia.
2 32 2^{32}232 = Transparencia alfa +2 8 2^{8}28 (B) *2 8 2^{8}28 (G) *2 8 2^{8}28 (R)
Imagen de cuatro canales significa que cada píxel tiene 4 representaciones de valor, profundidad de bits = 4 * 8 = 32.
PNG es un formato de imagen que usa RGBA.

Imagen binarizada
El significado de una imagen binaria es que cada píxel de cada imagen solo puede tomar 0 o 255, donde 0 es negro y 255 es blanco, es decir, blanco o negro. Convertimos nuestra imagen en color a escala de grises y la emitimos.
La profundidad de bits es 1, lo que significa que cada píxel está representado por 1 bit, es decir, 1 o 0.

Conversión entre números de canal

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

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

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

Luego, hablemos de cómo se almacena la imagen, incluso cómo se codifica:
si es una imagen de un solo canal, es decir, una imagen en escala de grises, cada valor de píxel puede usar un binario de ocho bits, como se muestra a continuación:
inserte la descripción de la imagen aquí

Entre ellos, I(ij) representa el valor de brillo de la fila iy la columna j.

Si se trata de una imagen multicanal, como una imagen RGB, cada píxel está representado por tres bytes. En OpenCV, el orden de los canales de las imágenes RGB es BGR y el almacenamiento es como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Enlace original: https://blog.csdn.net/mao_hui_fei/article/details/78217049

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

leer y mostrar imágenes

Introducción al parámetro cv2.imread
cv2.imread(nombre de archivo, banderas=Ninguno)

nombre de archivo: dirección de imagen como: './xxx.png'

banderas: bits de bandera, que indican el formato de los datos leídos

  • -1: Imagen original. Conserva el canal de color original de la imagen leída. Equivalente a IMREAD_UNCHANGED
  • 0: imagen en escala de grises. Equivalente a IMREAD_GRAYSCALE
  • 1: Mapa de colores. Se ignora la transparencia de la imagen, este es el parámetro predeterminado. Equivalente a IMREAD_COLOR

el código se muestra a continuación:

# 引入包
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() # 删除建立的全部窗口,释放资源

La pantalla de resultados:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_33538887/article/details/126478280
Recomendado
Clasificación