版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章
图像的基本操作计算机视觉应用开发案例教程目录CONTENT2.1NumPy基础知识012.2图像属性的获取与分析022.3像素的读取与修改032.4ROI的提取与处理042.5图像通道的分离与合并05任务实践06拓展实训07本章小结08
课后习题09工作情境“拆解开图像、调整细节”工作情境质检岗要从零件图里抠出关键区域看缺陷医疗影像辅助岗要调通道亮度突出病变零售技术岗要核对商品图尺寸是否符合系统要求用NumPy教你看图像属性、改像素、提ROI、分通道,每一步都对应实际需求学会ROI提取,下次碰到“只分析图像局部”的任务就能直接上手;工作情境掌握通道调整,还能帮着优化影像显示效果。技能串起来,就是你应对“精准处理图像”需求的核心能力。2.1NumPy基础知识2.1NumPy基础知识掌握NumPy基础操作,是理解图像处理原理、高效编写代码的关键。在OpenCV中,图像数据以NumPy数组(ndarray)形式存储——彩色图像是3维数组(高度
×
宽度
×
通道数),灰度图是2维数组(高度
×
宽度)。NumPy核心数据类型2.1.1NumPy支持多种数据类型,与图像处理关联最紧密的是以下3种np.float32:32位浮点数(含小数)——用于存储归一化后的像素值,如将0-255转为0.0-1.0。32:有符号32位整数(取值范围-2³¹~2³¹-1)——用于存储图像运算中的中间结果,如梯度值;p.uint8:无符号8位整数(取值范围0-255)——图像像素的默认类型,像素亮度值0表示黑,255表示白;示例2-1:创建指定类型的NumPy数组NumPy基础简介importnumpyasnp
#导入NumPy库,约定简写为np#1.创建像素类型的数组(np.uint8)#模拟1个2×2的灰度图像素(值0-255)gray_pixels=np.array([[0,128],[192,255]],dtype=np.uint8)print("2×2灰度图像素数组:")print(gray_pixels)print("数据类型:",gray_pixels.dtype)
#输出dtype('uint8')#2.创建浮点数数组(模拟归一化像素)normalized_pixels=gray_pixels/255.0
#转为0.0-1.0print("\n归一化后的像素数组(float32):")print(normalized_pixels)print("数据类型:",normalized_pixels.dtype)
#输出dtype('float64'),可手动转为float32示例2-1:创建指定类型的NumPy数组运行结果:如图2-1所示,命令行将输出两个数组的数值及数据类型,清晰展示不同类型的应用场景。
图2-1创建指定类型的NumPy数组NumPy基础简介NumPy数组的创建2.1.2示例2-1:创建指定类型的NumPy数组NumPy基础简介如表2-1所示,图像处理中常用的数组创建方式有4种,对应不同场景,如创建全黑图像、模拟像素分布:函数功能应用场景np.array()从列表
/元组创建数组手动定义少量像素np.zeros()创建全
0数组创建全黑图像(像素值
0)np.ones()创建全
1数组生成基础模板np.arange()创建连续数值数组生成梯度像素表2-1常用的数组创建方式示例2-2:创建图像相关的NumPy数组NumPy基础简介importnumpyasnp#1.用np.zeros()创建全黑彩色图像(高度100,宽度200,3通道,uint8)#图像尺寸格式:(高度,宽度,通道数),对应OpenCV图像标准black_img=np.zeros((100,200,3),dtype=np.uint8)print("全黑彩色图像数组形状:",black_img.shape)#输出(100,200,3)print("全黑图像单个像素(BGR):",black_img[50,100])#访问并打印图像中第50行、第100列位置的
像素值;由于是全黑图像,B(蓝)、G(绿)、R(红)三个通道的值均为0,因此输出[000]#2.用np.ones()创建灰度模板(高度50,宽度50,单通道)gray_template=np.ones((50,50),dtype=np.uint8)*128#全1数组×128,像素值128(灰色)print("\n灰色模板数组形状:",gray_template.shape)#输出(50,50)print("灰色模板像素值:",gray_template[25,25])#访问并打印模板中第25行、第25列位置的像素值;由于数组所有元素均为128,因此输出128示例2-2:创建图像相关的NumPy数组NumPy基础简介#3.用np.arange()创建梯度灰度图(高度1,宽度256,单通道)gradient=np.arange(0,256,1,dtype=np.uint8).reshape(1,256)#np.arange(0,256,1)生成0到255的连续整数(步长为1),共256个值;dtype=np.uint8指定数据类型;.reshape(1,256)将一维数组重塑为1行256列的二维数组,代表高度1、宽
度256的单通道灰度图,像素值从左到右由0(黑)渐变到255(白)print("\n梯度数组形状:",gradient.shape)#输出(1,256)运行结果:如图2-2所示,命令行输出各数组的形状和关键像素值,后续可通过OpenCV显示这些数组,即图像。图2-2创建图像相关的NumPy数组NumPy数组的形状操作2.1.3查看数组形状,包含图像的高度、宽度、通道数;arr.shape修改数组形状,需保证总元素数不变;arr.reshape()NumPy基础简介数组的“形状”(shape)直接对应图像的“尺寸”,核心操作包括:删除维度为1的轴,如将(1,256)转为(256,);arr.squeeze()增加维度,如将(50,50)转为(50,50,1),单通道转3通道格式。arr.expand_dims()示例2-3:图像数组的形状修改NumPy基础简介importnumpyasnp#1.模拟灰度图像数组(200×300,单通道)gray_img=np.zeros((200,300),dtype=np.uint8)print("原始灰度图形状:",gray_img.shape)#输出(200,300)#2.用reshape()修改为1维数组(总像素数200×300=60000)gray_1d=gray_img.reshape(60000)print("1维数组形状:",gray_1d.shape)#输出(60000,)#3.用expand_dims()给灰度图加通道维度(转为3通道格式,方便与彩色图运算)gray_3ch=np.expand_dims(gray_img,axis=2)#axis=2表示在第3个维度(通道)加轴print("加通道后灰度图形状:",gray_3ch.shape)#输出(200,300,1)示例2-3:图像数组的形状修改NumPy基础简介#4.用squeeze()删除多余维度(还原为单通道)gray_back=gray_3ch.squeeze(axis=2)print("删除通道后灰度图形状:",gray_back.shape)#输出(200,300)运行结果:如图2-3所示,命令行依次输出形状修改前后的数组维度,体现“形状与图像尺寸的对应关系”。图2-3NumPy数组的形状操作NumPy数组的索引与切片2.1.42.1.4NumPy数组的索引与切片索引(取单个元素)和切片(取连续区域)是提取图像ROI(感兴趣区域)
的核心操作,规则与Python列表类似,但支持多维度操作,对应图像的“行、列、通道”。NumPy基础简介arr[行索引,列索引,通道索引](灰度图无通道索引);索引格式核心规则arr[行起始:行结束,列起始:列结束,通道起始:通道结束](冒号表示“全部”,结束索引不包含);注意:图像的“行”对应数组的第一个维度(高度),“列”对应第二个维度(宽度),与日常“宽
×
高”表述相反。切片格式示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介importnumpyasnpimportcv2#结合OpenCV显示结果#1.创建模拟彩色图像(300×400,3通道,BGR)#生成渐变背景:B通道从左到右递增,G通道从上到下递增img=np.zeros((300,400,3),dtype=np.uint8)#设置B通道(索引0对应B通道):列方向(水平方向)从左到右像素值从0递增到399#np.arange(0,400,1)生成0-399的连续整数(共400个,对应图像宽度400),形成形状为(400,)的一维数组#np.tile(...,(300,1))将一维数组重复300行(对应图像高度300),形成(300,400)的二维数组,赋值给B通道后,每个列的B值相同且从左到右递增示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介img[:,:,0]=np.tile(np.arange(0,400,1),(300,1))#B通道:列方向0-399#设置G通道(索引1对应G通道):行方向(垂直方向)从上到下像素值从0递增到299#np.arange(0,300,1)生成0-299的连续整数(共300个,对应图像高度300),形成(300,)的一维数组#.reshape(300,1)将一维数组转换为(300,1)的二维数组(300行1列)#np.tile(...,(1,400))将该数组重复400列(对应图像宽度400),形成(300,400)的二维数组,赋值给G通道后,每个行的G值相同且从上到下递增img[:,:,1]=np.tile(np.arange(0,300,1).reshape(300,1),(1,400))#G通道:行方向0-299#2.索引:取单个像素(第100行,第200列)的BGR值pixel=img[100,200]print("(100,200)像素的BGR值:",pixel)#输出[2001000](B=200,G=100,R=0)示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介#3.切片:提取ROI(第50-150行,第100-200列,全通道)#切片范围:行50≤y<150(高度100),列100≤x<200(宽度100)roi=img[50:150,100:200,:]print("ROI的形状:",roi.shape)#输出(100,100,3)#4.显示原图和ROIcv2.imshow("OriginalImage(B-GGradient)",img)cv2.imshow("ROI(50-150,100-200)",roi)cv2.waitKey(0)cv2.destroyAllWindows()示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介运行结果:如图2-4所示,弹出两个窗口,左侧为蓝绿渐变的原图,右侧为提取的100×100ROI区域;命令行输出单个像素值和ROI形状。图2-4图像数组的索引与切片(提取ROI)NumPy数组的迭代与运算2.1.5NumPy基础简介遍历图像像素是基础操作,NumPy提供两种方式:1.数组迭代(遍历像素)适合小图像,逻辑直观;基础for循环NumPy优化迭代器,适合大图像,效率更高。np.nditer()示例2-5:遍历灰度图像素并修改NumPy基础简介importnumpyasnpimportcv2#1.创建50×50的灰度图(初始值128,灰色)gray_img=np.ones((50,50),dtype=np.uint8)*128#2.方式1:for循环遍历(行→列)foryinrange(gray_img.shape[0]):#y:行索引(0-49,对应高度)forxinrange(gray_img.shape[1]):#x:列索引(0-49,对应宽度)
#左上角25×25区域像素值改为255(白色)ify<25andx<25:gray_img[y,x]=255示例2-5:遍历灰度图像素并修改NumPy基础简介#3.方式2:np.nditer()遍历(右下角25×25区域改为0(黑色))it=np.nditer(gray_img,flags=['multi_index'])#multi_index:获取当前索引whilenotit.finished:y,x=it.multi_index#当前像素的行、列索引ify>=25andx>=25:gray_img[y,x]=0it.iternext()#迭代下一个像素#4.显示结果cv2.imshow("IteratedGrayImage(White-TopLeft,Black-BottomRight)",gray_img)cv2.waitKey(0)cv2.destroyAllWindows()示例2-5:遍历灰度图像素并修改NumPy基础简介运行结果:如图2-5所示,窗口显示50×50的灰度图,左上角25×25为白色,右下角25×25为黑色,其余区域为灰色。图2-5遍历灰度图像素并修改NumPy基础简介2.数组运算(图像亮度调整、对比度调整)NumPy支持数组与标量、数组与数组的运算,直接对应图像的亮度(加常数,对像素值加正数可提升亮度,加负数则降低亮度)和对比度(乘常数,乘以大于1的数可增强对比度,乘以0到1之间的数可降低对比度,实际应用中常结合亮度补偿以避免画面整体过曝或过暗)调整,且运算速度远快于for循环。示例2-6:图像亮度与对比度调整NumPy基础简介importnumpyasnpimportcv2#1.读取灰度图像(用OpenCV读取,本身就是NumPy数组)gray_img=cv2.imread("lena_gray.jpg",cv2.IMREAD_GRAYSCALE)ifgray_imgisNone:print("图像读取失败!")else:
#2.亮度调整:所有像素加50(值需控制在0-255,避免溢出)#np.clip():将值限制在0-255,防止超过uint8范围(如250+50=300→255)#.astype(np.uint8):将运算结果转换回uint8类型(确保符合图像像素值的数据类型要求)bright_img=np.clip(gray_img+50,0,255).astype(np.uint8)示例2-6:图像亮度与对比度调整NumPy基础简介#3.对比度调整:所有像素乘1.5(增强对比度,同样需clip)contrast_img=np.clip(gray_img*1.5,0,255).astype(np.uint8)
#4.显示对比结果cv2.imshow("OriginalGrayImage",gray_img)cv2.imshow("Brightness+50",bright_img)cv2.imshow("Contrast×1.5",contrast_img)cv2.waitKey(0)cv2.destroyAllWindows()运行结果:如图2-6所示,弹出3个窗口,对比显示原图、亮度提高后的图像(更亮)、对比度增强后的图像(明暗差异更明显)。图2-6图像亮度与对比度调整2.2
图像属性的获取与分析2.2图像属性的获取与分析是理解图像的基础,包括尺寸(高度、宽度)、通道数、像素类型、总像素数,这些属性均通过NumPy数组的属性直接获取,无需额外计算。图像属性核心属性说明2.2.1核心属性说明图像属性的获取与分析OpenCV读取的图像(NumPy数组)有3个核心属性,对应图像的关键信息,如表2-2所示:属性含义格式
/示例img.shape图像尺寸
+通道数(最常用)彩色图:(高度,宽度,3);灰度图:(高度,宽度)img.dtype像素数据类型通常为
uint8(0-255)img.size总像素数(高度
×宽度×通道数)彩色图
(100,200,3):100×200×3=60000表2-2NumPy数组的3个核心属性分析图像属性2.2.2示例2-7:读取图像并输出所有属性图像属性的获取与分析importcv2#1.分别读取彩色图和灰度图#彩色图:用IMREAD_COLOR(1)读取,忽略Alpha通道color_img=cv2.imread("street_color.jpg",cv2.IMREAD_COLOR)#灰度图:用IMREAD_GRAYSCALE(0)读取gray_img=cv2.imread("street_color.jpg",cv2.IMREAD_GRAYSCALE)ifcolor_imgisNoneorgray_imgisNone:print("图像读取失败,请检查路径!")else:示例2-7:读取图像并输出所有属性图像属性的获取与分析
#2.分析彩色图属性print("="*50)print("彩色图像属性分析:")print(f"图像形状(高度,宽度,通道数):{color_img.shape}")height,width,channels=color_img.shape#解包获取高度、宽度、通道数print(f"高度:{height}像素")print(f"宽度:{width}像素")print(f"通道数:{channels}(BGR顺序)")print(f"像素数据类型:{color_img.dtype}")print(f"总像素数:{color_img.size}({height}×{width}×{channels}={height*width*channels})")示例2-7:读取图像并输出所有属性图像属性的获取与分析#3.分析灰度图属性print("\n"+"="*50)print("灰度图像属性分析:")print(f"图像形状(高度,宽度):{gray_img.shape}")gray_height,gray_width=gray_img.shapeprint(f"高度:{gray_height}像素(与彩色图一致)")print(f"宽度:{gray_width}像素(与彩色图一致)")print(f"通道数:1(灰度图无通道维度)")print(f"像素数据类型:{gray_img.dtype}")print(f"总像素数:{gray_img.size}({gray_height}×{gray_width}={gray_height*gray_width})")示例2-7:读取图像并输出所有属性图像属性的获取与分析#4.验证灰度图总像素数是彩色图的1/3print(f"\n验证:彩色图总像素数
÷3={color_img.size//3},与灰度图总像素数{gray_img.size}是否相等?{color_img.size//3==gray_img.size}")运行结果:如图2-7所示,命令行清晰输出彩色图和灰度图的所有属性,且验证“彩色图总像素数是灰度图的3倍”,因为彩色图有3个通道。图2-7:读取图像并输出所有属性注意数据类型转换通道数判断尺寸表述通过len(img.shape)判断图像类型——长度为3是彩色图,长度为2是灰度图;若需对图像进行加减运算,如亮度调整,建议先转为32再运算,避免uint8溢出(如250+10=260→4,错误);OpenCV中shape的顺序是(高度,宽度),与日常“宽
×
高”(如1920×1080)相反,需注意避免混淆。举例:1080P图像的shape是(1080,1920,3)。图像属性的获取与分析2.3
像素的读取与修改2.3像素的读取与修改是图像的最小单位,读取单个像素值、修改单个/区域像素值,如标记目标、绘制图形是基础操作,核心依赖NumPy数组的索引功能。像素单个像素的读取与修改2.3.1像素的读取与修改读取:pixel_value=img[y,x](y:行索引=高度方向,x:列索引=宽度方向);1.灰度图(2维数组)修改:img[y,x]=new_value(new_value需在0-255之间)。读取:b,g,r=img[y,x](返回B、G、R三个通道的值,顺序不可错);2.彩色图(3维数组,BGR通道)修改:img[y,x]=[new_b,new_g,new_r](按B→G→R顺序赋值)。示例2-8:读取并修改单个像素importcv2#1.读取彩色图和灰度图color_img=cv2.imread("dog_color.jpg",cv2.IMREAD_COLOR)gray_img=cv2.imread("dog_color.jpg",cv2.IMREAD_GRAYSCALE)ifcolor_imgisNoneorgray_imgisNone:
print("图像读取失败!")else:像素的读取与修改示例2-8:读取并修改单个像素#2.处理灰度图:读取并修改(100,200)像素print("="*50)print("灰度图像素操作:")old_gray_pixel=gray_img[100,200]print(f"修改前(100,200)像素值:{old_gray_pixel}")gray_img[100,200]=255#改为白色new_gray_pixel=gray_img[100,200]print(f"修改后(100,200)像素值:{new_gray_pixel}")像素的读取与修改示例2-8:读取并修改单个像素#3.处理彩色图:读取并修改(150,250)像素print("\n"+"="*50)print("彩色图像素操作(BGR顺序):")old_b,old_g,old_r=color_img[150,250]print(f"修改前(150,250)像素值:B={old_b},G={old_g},R={old_r}")color_img[150,250]=[0,0,255]#改为红色(B=0,G=0,R=255)new_b,new_g,new_r=color_img[150,250]print(f"修改后(150,250)像素值:B={new_b},G={new_g},R={new_r}")像素的读取与修改示例2-8:读取并修改单个像素#4.显示修改后的图像(标记修改位置)#灰度图:在(100,200)画一个5×5的白色方块(突出显示)gray_img[98:103,198:203]=255#彩色图:在(150,250)画一个5×5的红色方块color_img[148:153,248:253]=[0,0,255]cv2.imshow("GrayImage(ModifiedPixel)",gray_img)cv2.imshow("ColorImage(ModifiedPixel)",color_img)cv2.waitKey(0)cv2.destroyAllWindows()像素的读取与修改示例2-8:读取并修改单个像素#4.显示修改后的图像(标记修改位置)#灰度图:在(100,200)画一个5×5的白色方块(突出显示)gray_img[98:103,198:203]=255#彩色图:在(150,250)画一个5×5的红色方块color_img[148:153,248:253]=[0,0,255]cv2.imshow("GrayImage(ModifiedPixel)",gray_img)cv2.imshow("ColorImage(ModifiedPixel)",color_img)cv2.waitKey(0)cv2.destroyAllWindows()像素的读取与修改示例2-8:读取并修改单个像素运行结果:如图2-8所示,两个窗口分别显示灰度图和彩色图,修改的像素位置用5×5的方块标记(灰度图白色、彩色图红色),命令行输出修改前后的像素值。像素的读取与修改图2-8:读取并修改单个像素区域像素的批量修改2.3.22.3像素的读取与修改实际场景中常需修改一片区域的像素,如给图像加边框、遮挡敏感区域,用NumPy切片实现批量修改,效率远高于for循环。2.3.2区域像素的批量修改示例2-9:批量修改区域像素(加边框、遮挡区域)像素的读取与修改示例2-9:批量修改区域像素(加边框、遮挡区域)像素的读取与修改图像的高度,图像的上边缘从上到下前20行第2个冒号表示所有列,宽度第3个冒号表示所有通道示例2-9:批量修改区域像素(加边框、遮挡区域)像素的读取与修改垂直方向(行)计算水平方向(列)计算高度范围宽度范围RGB通道示例2-9:批量修改区域像素(加边框、遮挡区域)像素的读取与修改运行结果:如图2-9所示,窗口显示加蓝色边框的图像,中间有200×200的黑色遮挡区域,清晰体现批量修改效果。图2-9:批量修改区域像素2.4ROI的提取与处理2.4ROI的提取与处理ROI(RegionofInterest,感兴趣区域)是图像中需要重点处理的部分,如人脸、车牌等,本质是通过NumPy切片从原图像数组中“截取”部分区域,提取后可独立修改、分析,再放回原图像。2.4ROI的提取与处理ROI提取看似是“截取图像局部”的技术操作,实则蕴含“聚焦重点、精准突破”的思维方法——这一思维在工业检测、医疗诊断等实际岗位中尤为重要。ROI的提取与处理在汽车零件质检中,工程师需精准提取轴承、齿轮等关键ROI排查磨损缺陷,若因坐标偏差遗漏细节,可能导致整车安全隐患;在遥感图像分析中,聚焦耕地、水源等ROI监测环境变化,是服务“乡村振兴”“生态文明建设”国家战略的具体实践。例如作为未来的技术从业者,学习ROI处理不仅要掌握坐标选择、区域截取的技术要点,更要培养“立足岗位、服务大局”的意识,明白每一次精准操作都可能关系到产业安全、社会需求,以“责任为先”的态度对待技术学习,践行“技能成才、技能报国”的职业追求。提取的核心逻辑2.4.1roi=img[y_start:y_end,x_start:x_end,:](彩色图);roi=img[y_start:y_end,x_start:x_end](灰度图);提取格式ROI提取遵循“先行后列”的切片规则,对应图像的
“高度范围
×
宽度范围”:y_start(行起始)、y_end(行结束)对应图像的高度范围,x_start(列起始)、x_end(列结束)对应宽度范围,结束索引不包含;关键ROI的提取与处理可通过图像查看工具,如“画图”程序、PS等,获取ROI的大致坐标,再微调。技巧提取人脸ROI并修改2.4.2示例2-10:从人物图像中提取人脸ROI,调整亮度后放回原图ROI的提取与处理人脸‘抠’出来!打印它的形状示例2-10:从人物图像中提取人脸ROI,调整亮度后放回原图ROI的提取与处理亮度增强`np.clip`确保值不会溢出255,也不会低于0。”准确地放回了原图像中的对应位置示例2-10:从人物图像中提取人脸ROI,调整亮度后放回原图ROI的提取与处理#4.显示结果(标记ROI范围)#用矩形框标记原ROI位置(绿色,线宽2):cv2.rectangle(图像,左上角,右下角,颜色,线宽)cv2.rectangle(img,(x_start,y_start),(x_end,y_end),(0,255,0),2)#在图像上添加文字说明:cv2.putText(目标图像,文本内容,起始坐标,字体类型,字体缩放比例,颜色,线宽)#各参数详解:#-img:要添加文字的目标图像(此处为修改后的原图像)#-"FaceROI(Brightened)":要显示的文本内容,说明该区域是"经过亮度增强的人脸ROI"#-(x_start,y_start-10):文本的左下角坐标,设置在ROI左上角上方10像素处(避免文字覆盖ROI区域)#-cv2.FONT_HERSHEY_SIMPLEX:字体类型,为OpenCV内置的无衬线字体,清晰度高适合标注示例2-10:从人物图像中提取人脸ROI,调整亮度后放回原图ROI的提取与处理#-0.6:字体缩放比例,为基础字体大小的60%(数值越大文字越大)#-(0,255,0):文字颜色,与矩形框一致为绿色(BGR格式,B=0,G=255,R=0),保持标注风格统一#-2:文字线条的粗细,单位为像素,确保文字清晰可见cv2.putText(img,"FaceROI(Brightened)",(x_start,y_start-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)cv2.imshow("ImagewithBrightenedFaceROI",img)cv2.waitKey(0)cv2.destroyAllWindows()示例2-10:从人物图像中提取人脸ROI,调整亮度后放回原图ROI的提取与处理运行结果:如图2-10所示,窗口显示人物图像,人脸左上部区域亮度明显提高,且用绿色矩形框标记ROI范围。图2-10:从人物图像中提取人脸ROIROI的复制与粘贴2.4.3示例2-11:将图像中的某个ROI复制到另一位置ROI的提取与处理importcv2#1.读取包含花朵的彩色图像img=cv2.imread("flower.jpg",cv2.IMREAD_COLOR)ifimgisNone:print("图像读取失败!")else:#2.提取花朵ROI(手动指定坐标,需根据图像调整)flower_y_start,flower_y_end=150,350#花朵高度范围(200像素)flower_x_start,flower_x_end=200,400#花朵宽度范围(200像素)flower_roi=img[flower_y_start:flower_y_end,flower_x_start:flower_x_end,:]print(f"花朵ROI形状:{flower_roi.shape}")#输出(200,200,3)示例2-11:将图像中的某个ROI复制到另一位置ROI的提取与处理#3.选择粘贴位置(图像空白区域,避免覆盖原内容)paste_y_start,paste_y_end=flower_y_start,flower_y_start+(flower_y_end-flower_y_start)paste_x_start,paste_x_end=500,500+(flower_x_end-flower_x_start)#确保粘贴位置不超出图像范围(img.shape[0]是图像高度,img.shape[1]是图像宽度)ifpaste_y_end<=img.shape[0]andpaste_x_end<=img.shape[1]:#复制ROI到新位置(直接赋值)img[paste_y_start:paste_y_end,paste_x_start:paste_x_end,:]=flower_roi示例2-11:将图像中的某个ROI复制到另一位置ROI的提取与处理#4.标记ROI和粘贴位置#原ROI:红色矩形框(线宽2)#cv2.rectangle(目标图像,左上角坐标,右下角坐标,颜色,线宽)cv2.rectangle(img,(flower_x_start,flower_y_start),(flower_x_end,flower_y_end),(0,0,255),2)cv2.putText(img,"OriginalFlower",(flower_x_start,flower_y_start-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2)#粘贴位置:蓝色矩形框(线宽2)cv2.rectangle(img,(paste_x_start,paste_y_start),(paste_x_end,paste_y_end),(255,0,0),2)cv2.putText(img,"PastedFlower",(paste_x_start,paste_y_start-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,0,0),2)示例2-11:将图像中的某个ROI复制到另一位置ROI的提取与处理运行结果:如图2-11所示,窗口显示花朵图像,红色框标记原花朵ROI,蓝色框标记粘贴后的花朵,两处花朵完全一致,无明显差异。图2-11:将图像中的某个ROI复制到另一位置2.5
图像通道的分离与合并2.5图像通道的分离与合并彩色图像的B、G、R三个通道是独立存储的,可通过OpenCV的cv2.split()分离单个通道,也可通过cv2.merge()将多个单通道合并为彩色图。分离通道后可独立处理,如增强R通道实现“暖色调”效果,再合并回彩色图。核心函数说明2.5.1核心函数说明图像通道的分离与合并函数功能语法
/示例cv2.split()分离彩色图的
B、G、R通道b_chan,g_chan,r_chan=cv2.split(color_img)cv2.merge()合并
3个单通道为彩色图merged_img=cv2.merge([new_b,new_g,new_r])表2-3图像通道操作核心函数图像通道操作核心函数如表2-3所示:注意:cv2.split()返回的单个通道是2维数组,即灰度图格式,显示时为灰度效果,如B通道显示为“蓝色分量的灰度分布”。实例:通道分离与单独显示2.5.2示例2-12:分离彩色图的B、G、R通道,分别显示并对比图像通道的分离与合并importcv2#1.读取彩色图像color_img=cv2.imread("fruits_color.jpg",cv2.IMREAD_COLOR)ifcolor_imgisNone:print("图像读取失败!")else:#2.分离B、G、R通道b_chan,g_chan,r_chan=cv2.split(color_img)print(f"B通道形状:{b_chan.shape}(单通道,灰度图格式)")#输出(高度,宽度)示例2-12:分离彩色图的B、G、R通道,分别显示并对比图像通道的分离与合并#3.显示单个通道(灰度效果)#B通道:蓝色分量越多,灰度值越高(显示为亮区域)cv2.imshow("BChannel(BlueComponent)",b_chan)#G通道:绿色分量越多,灰度值越高cv2.imshow("GChannel(GreenComponent)",g_chan)#R通道:红色分量越多,灰度值越高cv2.imshow("RChannel(RedComponent)",r_chan)#4.显示原图对比cv2.imshow("OriginalColorImage(BGR)",color_img)cv2.waitKey(0)cv2.destroyAllWindows()示例2-12:分离彩色图的B、G、R通道,分别显示并对比图像通道的分离与合并运行结果:如图2-12所示,弹出4个窗口,分别显示彩色原图和B、G、R三个单通道的灰度图——例如红色水果在R通道中显示为亮区域,在B、G通道中显示为暗区域。图2-12:分离彩色图的B、G、R通道实例:通道修改与合并(实现特殊效果)2.5.32.5.3实例:通道修改与合并(实现特殊效果)通过修改单个通道的值,再合并可实现特殊色调效果,如“蓝色增强”、“红色减弱”,比直接修改彩色图更精准。示例2-13:增强B通道实现“冷色调”效果,合并后显示图像通道的分离与合并importcv2importnumpyasnp#1.读取彩色图像color_img=cv2.imread("sunset.jpg",cv2.IMREAD_COLOR)ifcolor_imgisNone:print("图像读取失败!")else:#2.分离B、G、R通道b_chan,g_chan,r_chan=cv2.split(color_img)
得到B、G、R的值示例2-13:增强B通道实现“冷色调”效果,合并后显示图像通道的分离与合并#3.修改单个通道:增强B通道(×1.8),减弱R通道(×0.5)#增强B通道(冷色调):值限制在0-255b_chan_enhanced=np.clip(b_chan*1.8,0,255).astype(np.uint8)#减弱R通道(减少暖色调)r_chan_reduced=np.clip(r_chan*0.5,0,255).astype(np.uint8)#G通道保持不变#4.合并修改后的通道cold_tone_img=cv2.merge([b_chan_enhanced,g_chan,r_chan_reduced])蓝色更强`np.clip`防止溢出红色减少重新合并示例2-13:增强B通道实现“冷色调”效果,合并后显示图像通道的分离与合并#5.显示对比结果cv2.imshow("OriginalSunset(WarmTone)",color_img)cv2.imshow("ColdToneSunset(BEnhanced,RReduced)",cold_tone_img)cv2.waitKey(0)cv2.destroyAllWindows()图2-13:增强B通道实现“冷色调”效果运行结果:如图2-13所示,弹出两个窗口,分别为:原始日落图像(暖色调,偏红);修改后的冷色调图像(偏蓝,暖色调减弱);对比效果明显。实例:单通道扩展为3通道灰度图转彩色图2.5.42.5.4实例:单通道扩展为3通道:灰度图转彩色图有时需将灰度图转为3通道彩色图,如与其他彩色图运算,可通过“复制单通道3次,再合并”实现。示例2-14:将灰度图转为3通道彩色图图像通道的分离与合并importcv2importnumpyasnp#1.读取灰度图像gray_img=cv2.imread("lena_gray.jpg",cv2.IMREAD_GRAYSCALE)ifgray_imgisNone:
print("图像读取失败!")else:print(f"原始灰度图形状:{gray_img.shape}(单通道)")#输出(高度,宽度)
#2.方法1:用cv2.merge()合并3次灰度图
#复制灰度图为B、G、R三个通道(值相同,显示为灰度)b_chan=gray_imgg_chan=gray_imgr_chan=gray_imggray_to_color1=cv2.merge([b_chan,g_chan,r_chan])示例2-14:将灰度图转为3通道彩色图图像通道的分离与合并#3.方法2:使用NumPy的stack()函数转为3通道彩色图(更简洁的实现方式)#np.stack(数组序列,axis=维度):将多个数组沿指定维度堆叠,形成新的多维数组#axis=2:指定在第2维(通道维度)堆叠,原灰度图为2维(高度,宽度),堆叠后变为3维(高度,宽度,3)#堆叠的3个gray_img分别对应B、G、R通道(顺序与merge方法一致,确保颜色格式正确)gray_to_color2=np.stack((gray_img,gray_img,gray_img),axis=2)#4.验证两个方法结果一致print(f"转为3通道后形状1:{gray_to_color1.shape}")#输出(高度,宽度,3)print(f"转为3通道后形状2:{gray_to_color2.shape}")#输出(高度,宽度,3)#np.array_equal(a,b):判断两个数组的元素和形状是否完全一致,验证两种方法结果相同print(f"两个3通道图像是否完全一致?{np.array_equal(gray_to_color1,gray_to_color2)}")#输出True示例2-14:将灰度图转为3通道彩色图图像通道的分离与合并#5.显示结果cv2.imshow("OriginalGrayImage",gray_img)cv2.imshow("GraytoColor(MergeMethod)",gray_to_color1)cv2.imshow("GraytoColor(StackMethod)",gray_to_color2)cv2.waitKey(0)cv2.destroyAllWindows()图2-14:将灰度图转为3通道彩色图运行结果:如图2-14所示,3个窗口显示的图像视觉效果一致,均为灰度,但后两个窗口的图像是3通道格式,可用于后续彩色图相关运算。任务实践任务实践任务1图像属性分析与ROI提取1.读取一张自己拍摄的彩色图像,如风景、人物;2.输出图像的高度、宽度、通道数、总像素数;3.手动指定ROI范围,如风景中的“天空”、人物中的“手部”,提取ROI;4.将ROI的亮度提高60,放回原图像,并用红色矩形框标记ROI位置;5.显示修改前后的图像,对比效果,保存修改后的图像为“roi_modified.jpg”。任务实践任务2通道交换实现“反色”效果1.读取一张彩色图像;2.分离B、G、R通道;效果1:通道交换(B→R,R→B,G保持不变),即“BGR转RGB”(即:对实际通道的像素值数组进行交换);效果2:反色(每个通道值=255-原通道值,如B反色=255-B);4.显示原图、通道交换图、反色图,保存反色图为“inverted_color.jpg”。3.实现两种效果:拓展实训熟练确定图像中目标区域,如证件照人物的ROI坐标;1.掌握“通道分离→背景像素修改→通道合并”的完整流程;2.实现证件照背景色从“红色”改为“蓝色”,巩固批量像素操作。3.实训目标实训1证件照ROI提取与背景色调整准备1张红色背景的证件照,如“id_photo_red.jpg”,分辨率建议400×600;素材方面实训准备画图工具,辅助查看ROI坐标,如Windows画图的“像素坐标”功能;工具方面ROI提取、BGR通道分离、批量像素值修改,相当于NumPy切片。核心技术实训1证件照ROI提取与背景色调整证件照背景为红色(B=0,G=0,R=255),需将背景区域的R通道值降低、B通道值提高,改为蓝色(B=255,G=0,R=0);人物区域为ROI,保持不变。实训步骤分析实训逻辑实训1证件照ROI提取与背景色调整流程:读取图像→确定背景区域(非ROI)→分离B/G/R通道→修改背景通道值→合并通道→显示保存。实训步骤分析实训逻辑实训1证件照ROI提取与背景色调整创建“exp1_id_photo_bg.py”,代码如下(含详细注释)实训1证件照ROI提取与背景色调整创建“exp1_id_photo_bg.py”,代码如下(含详细注释)实训1证件照ROI提取与背景色调整确定ROI坐标框选时,可以稍微向内收紧一点,确保只框住人物,避免把背景边缘也包进来,造成处理残留。”只改动B和R将彩色的三维数组精准地分离成B、G、R三个独立的二维矩阵;创建“exp1_id_photo_bg.py”,代码如下(含详细注释)实训1证件照ROI提取与背景色调整‘掩码(Mask)’的布尔数组创建了一个和原图尺寸一样、全部是True的‘施工图纸’;把ROI区域的标记从True改成False,把它划为‘保护区’。掩码标记为True(即背景)的所有位置创建“exp1_id_photo_bg.py”,代码如下(含详细注释)实训1证件照ROI提取与背景色调整创建“exp1_id_photo_bg.py”,代码如下(含详细注释)实训1证件照ROI提取与背景色调整展示成果保存
1.调整ROI坐标:用画图工具打开证件照,鼠标移动到人物边缘,记录左上角(x_start,y_start)和右下角(x_end,y_end)坐标,替换代码中的示例值;运行与验证
2.运行代码:执行pythonexp1_id_photo_bg.py;
3.验证结果:窗口显示:左侧红色背景原图,绿色框标记ROI,右侧蓝色背景修改图,ROI保持一致;文件保存:检查是否生成“id_photo_blue.jpg”,打开确认背景色已改为蓝色,人物无变化;
4.异常处理:若背景仍有红色残留,调整mask范围或增大B通道值,如255;减小R通道值,如0。实训1证件照ROI提取与背景色调整实训结果与分析图2-15:证件照ROI提取与背景色调整掩码(mask)作用:通过布尔数组快速区分背景与ROI,避免多次切片操作,提高代码效率;通道修改逻辑:红色背景的核心是R通道值高,蓝色背景的核心是B通道值高,通过单独修改通道实现颜色转换,不影响人物区域;运行结果:如图2-15所示。实训1证件照ROI提取与背景色调整实训1证件照ROI提取与背景色调整试一试:同学们可以尝试在代码中修改ROI标记框的位置和大小,直至完全将图像中的人脸框住。实训2渐变图制作(灰度+彩色)熟练使用NumPy的arange()、reshape()创建渐变数组;1.掌握用np.stack()合并通道制作彩色渐变图;2.理解“数组形状与图像尺寸”的对应关系,巩固NumPy基础。3.实训目标无需外部素材(通过NumPy生成图像数据);素材方面实训准备np.arange()生成连续值、reshape()调整形状、np.stack()合并通道。核心技术实训2渐变图制作(灰度+彩色)灰度渐变图:生成0-255的连续值,调整为(200,256)形状(高度200,宽度256),实现“左黑右白”渐变;实训步骤分析实训逻辑彩色渐变图:生成B、G通道渐变(B从0→255,G从255→0),R通道设为0,合并后实现“左绿右蓝”渐变。实训2渐变图制作(灰度+彩色)创建“exp2_gradient_making.py”,代码如下:实训2渐变图制作(灰度+彩色)生成长度为256的一维数组dtype=np.uint8:确保是0-255范围内的整数在水平方向(列)重复1次创建“exp2_gradient_making.py”,代码如下:实训2渐变图制作(灰度+彩色)B通道一个从255到0的递减数组红色通道全程‘熄火’创建“exp2_gradient_making.py”,代码如下:实训2渐变图制作(灰度+彩色)
1.运行代码:执行pythonexp2_gradient_making.py;
2.验证结果:灰度渐变窗口:从左到右颜色从纯黑(0)逐渐过渡到纯白(255),无明显断层;彩色渐变窗口:从左到右颜色从纯绿(B=0,G=255,R=0)逐渐过渡到纯蓝(B=255,G=0,R=0);文件保存:检查是否生成“gray_gradient.jpg”和“color_gradient.jpg”,打开确认渐变效果;
3.扩展尝试:修改np.arange()的步长(如np.arange(0,256,2)),观察渐变是否变“粗糙”。运行与验证实训2渐变图制作(灰度+彩色)实训结果与分析np.tile()作用:将1D数组垂直重复多次,快速生成固定高度的渐变图,避免for循环;图2-16:渐变图制作彩色渐变原理:通过调整不同通道的渐变方向(B递增、G递减),实现两种颜色的平滑过渡;运行结果:如图2-16所示。实训2渐变图制作(灰度+彩色)本章小结本章小结1.NumPy基础是核心:OpenCV图像以NumPy数组存储,需掌握数组创建(np.zeros())、形状操作(shape)、索引切片(ROI提取)、运算(亮度调整),这些是后续所有操作的基础;2.图像属性易获取:通过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某机械厂技术培训准则
- 某啤酒厂生产记录准则
- 机械厂物料管理办法
- 荒山承包利用合同范本三篇
- AI技术助力传统木雕文化数字化传播
- 2026年四川凉山彝族自治州中考历史真题(教师卷)
- 四川省巴中市恩阳区2024-2025学年九年级上学期语文期中考试试卷(含答案)
- 2026年全国熔化焊接与热切割考试真题(附答案)
- 长江大学C语言期末考试题及答案
- 高中重庆语文试题及答案
- 2026年四川省成都市中考数学真题含答案
- 木栈道翻新维修施工方案
- 风险金管理暂行办法
- 企业业财融合管理年度工作报告
- 家庭教育非暴力沟通课件
- 企业日常行政事务外包协议
- 耐药菌感染患者的护理
- 湖南省五市十校2025届高二物理第二学期期末综合测试模拟试题含解析
- 部编版语文五年级下册全册复习知识汇-总
- 病案书写技能大赛题库5附有答案
- 建筑变形测量规范
评论
0/150
提交评论