目标: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)
pythonimport 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()
注意事项:上述代码呈现的图片大小不能调,下面的是可以手动调大小的
pythonimport 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为单通道图像或者列表,每个通道的图像长和款应该相同
pythonimport 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)=列数
如何获取图像的长和宽?
pythonimport 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
插值方法(决定缩放时如何计算新像素值,影响结果质
pythonimport 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))