【opencv-Python学习笔记(2): 图像表示;图像通道分割;图像通道合并;图像属性】

目标:1.学会图像的通道分割与合并

2.学会图像的的常规操作
##一些概念:

二值图像:只包含黑色和白色两种颜色的图像,1为白色,0为黑色

灰度图像:计算机会将灰度处理为256个灰度级,用区间[0,255]来表示。其中255表达纯白 色,0表示纯黑色。

彩色图像:由于色彩空间不一致,导致彩色图像的表示也不一致,以RGB图像为例,由三个 通道组成,R通道,G通道,B通道,每个色彩的通道值处于[0,255],经过不同的组合共有 256*256*256=16777216种颜色。但是在opencv中,图像通道是按照 B,G,R排列的

1. 通道操作

为什么需要通道操作?

有时候,需要将图像的通道数进行分割处理,在opencv中,图像通道是按照 B,G,R排列的

方法:分为索引拆分和通过函数拆分,主要讲解函数拆分

函数cv2.spilt(img)

python 复制代码
import cv2

lean=cv2.imread("1.JPG")
b,g,r=cv2.split(lean)   # 与下面的写法是一致的

# b1=cv2.split(lean)[0]
# g1=cv2.split(lean)[1]
# r1=cv2.split(lean)[2]

cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事项:上述代码呈现的图片大小不能调,下面的是可以手动调大小的

python 复制代码
import cv2

result=cv2.imread("1.JPG")
b,g,r=cv2.split(result)    #分割图像,将图像按照B,G,R的通道进行拆分
cv2.namedWindow('11',cv2.WINDOW_NORMAL)  # 需要自定义个窗体,正常模式
cv2.namedWindow('12',cv2.WINDOW_NORMAL)
cv2.namedWindow('13',cv2.WINDOW_NORMAL)
cv2.imshow("11",b)
cv2.imshow("12",g)
cv2.imshow("13",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 通道合并

说明:通道合并是通道拆分的逆过程,例如将三个通道的灰度图像构成 一副彩色图像。

为什么需要通道合并?

有时候可能需要两个通道合并或者多个通道合并,图像在opencv中是按照B,G,R的顺序进行排列的,可以先对图像进行拆分操作,在按照R,G,B的顺序进行合并。

函数:cv2.merge(mv)

解释:参数mv为单通道图像或者列表,每个通道的图像长和款应该相同

python 复制代码
import cv2

result=cv2.imread("1.JPG")
b,g,r=cv2.split(result)    #分割图像,将图像按照B,G,R的通道进行拆分
cv2.namedWindow('11',cv2.WINDOW_NORMAL)  # 需要自定义个窗体,正常模式
cv2.namedWindow('12',cv2.WINDOW_NORMAL)
#cv2.namedWindow('13',cv2.WINDOW_NORMAL)

bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])

cv2.imshow("11",bgr)
cv2.imshow("12",rgb)
#cv2.imshow("13",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像属性

下面仅介绍常用的图像属性

shape:如果是彩色图像,则返回行数、列数、通道数的**数组,**若是二值图像或者灰度图像 则只返回行数和列数

size:返回图像的像素数,其值为 "行x列x通道数",灰度图像或者二值图像通道数为1

dtype:返回图像的数据类型

### 图像的高和宽分别对应着列数和行数。

  • 高度(Height)=行数
  • 宽度(Width)=列数

如何获取图像的长和宽?

python 复制代码
import cv2

# 读取图像(返回的是 numpy 数组)
img = cv2.imread("image.jpg")

# 获取图像的高度(行数)和宽度(列数)
height, width = img.shape[:2]  # 取前两个值,分别是高度和宽度

print(f"图像宽度(列数):{width}")
print(f"图像高度(行数):{height}")

如何统一图像的大小?如何批量统一图像的嗯大小?

函数:cv2.resize(src, dsize, fx=0, fy=0, interpolation=cv2.INTER_LINEAR``)

参数 作用
src 输入图像(numpy 数组)
dsize 目标尺寸,格式为 (宽度, 高度)(如 (640, 480)
fx/fy 水平 / 垂直方向的缩放比例(若指定,则 dsize 需设为 None
interpolation 插值方法(决定缩放时如何计算新像素值,影响结果质
python 复制代码
import cv2
import os
from glob import glob

def resize_images(input_dir, output_dir, target_size=(640, 480)):
    """
    批量调整图像大小
    :param input_dir: 原始图像所在文件夹
    :param output_dir: 调整后图像的保存文件夹
    :param target_size: 目标尺寸 (宽度, 高度)
    """
    # 创建输出文件夹(如果不存在)
    os.makedirs(output_dir, exist_ok=True)
    
    # 获取文件夹中所有图片(支持常见格式)
    image_paths = glob(os.path.join(input_dir, "*.[jpgnJPGEpngPNG]"))
    
    for img_path in image_paths:
        # 读取图像
        img = cv2.imread(img_path)
        if img is None:
            print(f"无法读取图像: {img_path}")
            continue
        
        # 调整图像大小
        # interpolation参数:缩放时的插值方法
        # - cv2.INTER_AREA: 适合缩小图像(推荐)
        # - cv2.INTER_CUBIC: 适合放大图像(质量更高但速度慢)
        # - cv2.INTER_LINEAR: 线性插值(默认,平衡速度和质量)
        resized_img = cv2.resize(img, target_size, interpolation=cv2.INTER_AREA)
        
        # 保存调整后的图像
        img_name = os.path.basename(img_path)
        output_path = os.path.join(output_dir, img_name)
        cv2.imwrite(output_path, resized_img)
        print(f"已保存: {output_path}")

# 使用示例
if __name__ == "__main__":
    input_folder = "原始图片文件夹路径"  # 替换为你的输入文件夹
    output_folder = "调整后图片文件夹路径"  # 替换为你的输出文件夹
    target_width = 800    # 目标宽度
    target_height = 600   # 目标高度
    resize_images(input_folder, output_folder, (target_width, target_height))