FEATURED · 精选文章

初学opencv

发布时间 / 2026/8/12 18:11:22
来源 / 创域科博编辑部
栏目 / 资讯中心
初学opencv 初学opencv首先要下载cv2库导包import cv2 as cv2一.读取1.读取与显示图片操作读取图片用的是cv2里的imread函数参数是图片的路径绝对路径和相对路径都可以# 读取图片 a cv2.imread(./03.jpg)显示图片用的是cv2里的imshow函数参数是图片的名称图片的数据cv2.imshow(tu,a) # 显示图片。显示图片的名称显示图片的数据。如果只有imshow函数那么运行代码后图片会闪一下就消失了想要图片保留就要设置窗口显示的时间这里用到的是waitkey函数里面的参数表示显示的时间单位是毫秒0代表窗口显示时间是永久。按一下键盘上的按键图片会关闭waitkey函数有一个返回值获取的是按键的ASCII码值。b cv2.waitKey(0)关闭所有打开的窗口并释放所有相关内存。cv2.destroyAllWindows() #关团所有打开的窗口并释放所有相关内存。对于简单的程序不需要调用这些函数应用程序的所有资源和窗口在退出时都会由操作系统自动关闭。2.观察图像的属性#调试模型观察shapedtupe、size属性 print(图像形状shape:,a.shape) #高、宽、通道数 print(图像数据类型dtype:,a.dtype) #无符号 8 位整数用于表示像素值的范围在 0 到 255 之间。 print(图像大小size:,a.size) #表示图像的大小通常是一个整数表示图像的总像素数即图像的高度乘以宽度乘以通道数图像形状shape: (800, 800, 3)图像数据类型dtype: uint8图像大小size: 1920000图像的形状为高宽通道数图像的数据类型是uint8无符号8位整数用于表示像素值的范围在0到255之间。图像的大小通常是一个整数表示图像的总像素数即图像的高度乘以宽度乘以通道数。3.读取灰度图b cv2.imread(./03.jpg,cv2.IMREAD_GRAYSCALE) cv2.imshow(xx,b) a cv2.waitKey(0) cv2.destroyAllWindows()读取灰度图的方法有多种一是在读取图片的时候在imread里面添加cv2.IMREAD_GRAYSCALE参数表示读取灰度图二是在这个位置添0三是使用cvtColor函数需要传入的参数是srccodesrc代表原图code代表方法这里使用COLOR_RGB2GRAY。b cv2.imread(./03.jpg,0)c cv2.cvtColor(b,cv2.COLOR_RGB2GRAY)4.图片保存图片保存使用imwrite函数参数是要保存的路径和图片数据。cv2.imwrite(03_GRAY.jpg,b)5.ROI区域感兴趣ROI指的是图像或视频中感兴趣的特定区域需要进行分析或处理。ROI可以由用户手动选择也可以使用计算机视觉算法自动检测。b a[100:500,150:500] cv2.imshow(qiepian,b)二.操作1.提取颜色通道a1 a[:,:,0] # 蓝色通道(B通道) a2 a[:,:,1] # 绿色通道(G通道) a3 a[:,:,2] # 红色通道(R通道)根据前面的shape属性我们可以通过切片提取BGR三个通道的数据或者我们可以使用cv2.split()来分离颜色通道。b,g,r cv2.split(a)那么如果我们有三个通道的数据也可以合成原图像。这里使用的是merge函数参数是三个通道的数据。img cv2.merge((a1,a2,a3)) cv2.imshow(result3,img) cv2.waitKey(0) cv2.destroyAllWindows()1.图片修改图片打码xxx np.random.randint(0,256,(3,3))用的是numpy库里的random.randint方法得到的是0-2553x3的随机整数。# 图片打码 a[350:450,250:450] np.random.randint(0,256,(100,200,3)) cv2.imshow(feilinsi,a) cv2.waitKey(0) cv2.destroyAllWindows()注意打码的范围必须与图片切片的范围一致切片的大小为100x200生成的随机整数是0-255100x200三个通道。图片组合a cv2.imread(./03.jpg) b cv2.imread(./04.jpg) a[350:450,250:450] b[50:150,200:400] cv2.imshow(b,b) cv2.imshow(a,a) cv2.waitKey(0) cv2.destroyAllWindows()图片组合与上述的切片打码有相似之处两张图片组合的地方大小必须一致。图片缩放图片缩放用的cv2.resize方法里面的参数是1.src要调整大小的输入图像可以是numpy数组PIL图像或其他类型。2.dsize输出图像的大小可以是一个元组列如宽高或者使用整数标量来缩放原始图像。如果为NONE则根据scalefx和scalefy缩放原始图像。3.fx沿x轴的缩放系数。4.fy沿y轴的缩放系数。a cv2.imread(04.jpg) # a_new cv2.resize(a,(200,200))# 宽、高 a_new cv2.resize(a,None,fx0.5,fy0.5) cv2.imshow(a.a) cv2.imshow(a_new,a_new) cv2.waitKey(0) cv2.destroyAllWindows()读取图片04使用resize对图片操作参数a原图像None根据位置传递是指dsizeNonefx0.5fy0.5表示沿xy方向变为原来的二分之一。后面展示图片设置图片停留时间等。三.图像运算1.图像加法运算1.图像加法运算对于号运算当对图像a图像b进行加法求和时遵循以下规则1.当某位置像素相加得到的数值小于255时该位置数值为两图像数值相加的和。2.当某位置像素相加得到的数值大于255时该位置数值将截断结果并减去256列如相加后是260实际为260-2564d a[50:450,50:400] b[50:450,50:400] cv2.imshow(ab,d) cv2.waitKey(0) cv2.destroyAllWindows()运行结果图2.add对于cv2.add()运算当对图像ab进行加法求和时遵循以下规则1.当某位置像素相加得到的数值小于255时该位置数值为两图像数值相加之和。2.当某位置像素相加得到的数值大于255时该位置数值为255.a cv2.imread(./03.jpg) b cv2.imread(./04.jpg) a cv2.resize(a,(400,400)) b cv2.resize(b,(400,400)) c cv2.add(a,b) cv2.imshow(a add b,c) cv2.waitKey(0) cv2.destroyAllWindows()代码分别读入图像ab使用resize更改图像的大小为(400,400),使用add方法将ab加起来命名为c展示图像设置图片停留时间等。运行结果可以看到超过255的值都变为255即为白色。3.图像加权运算图像的加权运算规则1.在计算两幅图像的像素值之和时将每幅图像的权重考虑进来用公式表示为d cv2.addWeighted(a,0.5,b,0.5,10) #10:图像的亮度值(常数)将添加到加权和上 cv2.imshow(addWeighted,d) cv2.waitKey(0) cv2.destroyAllWindows()参数src1alphasrc2betagamma图像1权重a图像2权重b权重c四.边界填充cv2.copyMakeBorder()是OpenCV库中的一个函数用于给图像添加额外的边界(padding)。它有以下几个参数:1.src:要扩展边界的原始图像。2.topbottomleftright:相应方向上的边框宽度。3.borderType:定义要添加边框的类型它可以是以下的一种:cv2.BORDER_CONSTANT: 添加的边界框像素值为常数(需要额外再给定一个参数value)。cv2.BORDER_REFLECT: 添加的边框像素将是边界元素的镜面反射类似于 gfedcba|abcdefgh|hgfedcba。(交界处也复制了)cv2.BORDER_REFLECT_101或cv2.BORDER_DEFAULT: 和上面类似但是有一些细微的不同类似于 gfedcb|abcdefgh|gfedcba (交接处删除了)。cv2.BORDER_REPLICATE: 使用最边界的像素值代替类似于 aaaaaa|abcdefgh|hhhhhhh。cv2.BORDER_WRAP: 上下左右边依次替换cdefgh|abcdefgh|abcdefg。4.dst: 输出图像可选参数。import cv2 a cv2.imread(./03.jpg) a cv2.resize(a,(400,400)) top,bottom,left,right 50,50,50,50 cv2.imshow(yuantu,a) cv2.waitKey(0)读入数据更改数据的大小设置topbottomleftright:相应方向上的边框宽度为50先展示一下原图。1.cv2.BORDER_CONSTANT操作constant cv2.copyMakeBorder(a,top,bottom,left,right, borderTypecv2.BORDER_CONSTANT,value(229,25,80)) cv2.imshow(CONSTANT,constant) cv2.waitKey(0)填充后的结果图2.cv2.BORDER_REFLECT操作reflect cv2.copyMakeBorder(a,top,bottom,left,right, borderTypecv2.BORDER_REFLECT) cv2.imshow(REFLECT,reflect) cv2.waitKey(0)填充后的结果图3.其它操作reflect101 cv2.copyMakeBorder(a,top,bottom,left,right, borderTypecv2.BORDER_REFLECT101) replicate cv2.copyMakeBorder(a,top,bottom,left,right, borderTypecv2.BORDER_REPLICATE) wrap cv2.copyMakeBorder(a,top,bottom,left,right, borderTypecv2.BORDER_WRAP) cv2.imshow(REFLECT_101,reflect101) cv2.waitKey(0) cv2.imshow(REPLICATE,replicate) cv2.waitKey(0) cv2.imshow(WRAP,wrap) cv2.waitKey(0)填充后的结果图五.阈值处理阈值处理是指剔除图像内像素值高于一定值或低于一定值的像素点。使用的方法为retval, dst cv2.threshold(src, thresh, maxval, type)参数说明src要进行阈值分割的图像可以是多通道的8位或32位浮点型数值。thresh要设定的阈值。maxval当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时需要设定的最大值。retval返回的阈值。dst阈值分割结果图像与原始图像具有相同的大小和类型。type阈值分割的类型具体内容如下表所示选项像素值 thresh其他情况CV2.THRESH_BINARYmaxval0CV2.THRESH_BINARY_INV0maxvalCV2.THRESH_TRUNCthresh当前灰度值CV2.THRESH_TOZERO当前灰度值0CV2.THRESH_TOZERO_INV0当前灰度值import cv2 image cv2.imread(./03.jpg,0) image cv2.resize(image,(400,400)) ret,binary cv2.threshold(image,175,255,cv2.THRESH_BINARY) ret1,binaryinv cv2.threshold(image,175,225,cv2.THRESH_BINARY_INV) ret2,trunc cv2.threshold(image,175,225,cv2.THRESH_TRUNC) ret3,tozero cv2.threshold(image,175,225,cv2.THRESH_TOZERO) ret3,tozeroinv cv2.threshold(image,175,225,cv2.THRESH_TOZERO_INV) cv2.imshow(gray,image) cv2.waitKey(0) cv2.imshow(binary,binary) # 偏白的变纯白偏黑的变纯黑 cv2.waitKey(0) cv2.imshow(binaryinv,binaryinv) #偏白的变纯黑偏黑的变纯白 cv2.waitKey(0) cv2.imshow(trunc,trunc) #白色变得一样灰蒙蒙偏黑的不变 cv2.waitKey(0) cv2.imshow(tozero,tozero) #偏白色不变偏黑的就变纯黑 cv2.waitKey(0) cv2.imshow(tozeroinv,tozeroinv) #偏白色变纯黑偏黑的不变 cv2.waitKey(0)运行结果分别是灰度图graybinary操作图binaryinv操作图trunc操作图tozero操作图tozeroinv操作图。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻