资讯专栏INFORMATION COLUMN

OpenCV基础操作

leone / 1608人阅读

摘要:为什么呢使用读取图像时,默认彩色图像的三通道顺序为,这与我们所熟知的中的通道和通道正好互换位置了。而使用函数却默认显示图像的通道顺序为,所以导致出现色差发蓝很好解决,用我们前边所说的,图像通道分离。

所用版本 OpenCV3.4.1.15

读取图像

随便拿个图像即可实验,当然你也可以用这个在计算机视觉领域大名鼎鼎的图像 http://www.lenna.org/full/l_hires.jpg
(记得裁剪,要个头就行~~)

import cv2import matplotlib as pltimport numpy as np# 读取图像img = cv2.imread("test.jpg")# 展示图像  前面是窗口名 后面是要显示的图像cv2.imshow("img",img)# 等待时间 毫秒级 0表示任意键终止cv2.waitKey(0)# 图像大小  会输出[h w c] 高 宽 通道数print(img.shape)# 读取图像的时候 指定参数可以读取灰度图img2 = cv2.imread("test.jpg",cv2.IMREAD_GRAYSCALE)# 此时再输出shape就只有h w了 没有通道数print(img2.shape)# 展示灰度图cv2.imshow("img2",img2)cv2.waitKey(0)# 图像保存 指定一个名字 指定要保存的图像cv2.imwrite("huidu.jpg",img2)

有的时候图像大小比较大,所以显示出来一个屏幕看不全,就比较麻烦。
我们可以先设置窗口大小,再在指定窗口显示图像

    # set window size    cv2.namedWindow("dst",0);    cv2.resizeWindow("dst",1280,760);    cv2.imwrite("dst.png",dst);

图像裁剪和颜色通道切分

img = cv2.imread("test.jpg")# 截取部分图像s = img[0:200,0:200] # 前面是h 后面是wcv2.imshow("img",s)cv2.waitKey(0)# 颜色通道切分 b g r分别是三个通道的值b,g,r=cv2.split(img)# opencv里面图像的通道顺序是B G R# 也就意味着 B G R顺序分别是 0 1 2# [:,:,0] 切片 前面俩冒号 代表取图像宽高的所有 后面0 代表B通道cur_img=img.copy()cur_img[:,:,0]=0 # B通道置为0cur_img[:,:,1]=0 # G通道置为0cv2.imshow("R",cur_img) # 也就是说只保留了R通道cv2.waitKey(0)

读取视频

import cv2import matplotlib as pltimport numpy as np# 读取视频 也可以读取摄像头vc = cv2.VideoCapture("test.mp4")# 检查是否打开正确if vc.isOpened():    # .read 读取第一帧 会返回两个值 open是布尔值表示是否读成功 第二个参数就是当前帧    open , frame = vc.read()else:    open = Falsewhile open:    ret,frame = vc.read()    if frame is None:        break    if ret == True:        # gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 把当前帧转换成灰度图        cv2.imshow("result",frame)        if cv2.waitKey(100) & 0xFF ==27: # 每处理完一帧 等待100毫秒 27代表esc键 按esc退出            breakvc.release()cv2.destroyAllWindows() #销毁所有窗口

图像边界填充

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("test.jpg")# 边界填充# 定义要填充的大小 上下左右top_size,bottom_size,left_size,right_size = (50,50,50,50)# copyMakeBorder 边界填充函数 参数分别是:要填充的图像,上,下,左,右,边界类型# BORDER_REPLICATE 复制法 就是复制最边缘的像素 作为填充replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)# BORDER_REFLECT 反射法 把像素在两边进行复制 如     edcba | abcde | edcbareflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)# BORDER_REFLECT_101 反射法 以最边缘的像素为轴 对称   edcb | abcde | dcbareflect_101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)# BORDER_WRAP 外包装法 右边正着往外延申,左边倒着延申   edcba | abcde | abcdewrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)# 常量法 指定一个数值作为填充constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)# 使用matplotlib把图像显示出来plt.subplot(2,3,1),plt.imshow(img,"gray"),plt.title("ORIGINAL")plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("REPLICATE")plt.subplot(233),plt.imshow(reflect,"gray"),plt.title("REFLECT")plt.subplot(234),plt.imshow(reflect_101,"gray"),plt.title("REFLECT_101")plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("WRAP")plt.subplot(236),plt.imshow(constant,"gray"),plt.title("CONSTANT")plt.show()

显示结果如下:


你会发现,这个图是蓝色的。为什么呢?
使用cv2.imread()读取图像时,默认彩色图像的三通道顺序为B、G、R,这与我们所熟知的RGB中的R通道和B通道正好互换位置了。
而使用plt.imshow()函数却默认显示图像的通道顺序为R、G、B,所以导致出现色差发蓝
很好解决,用我们前边所说的,图像通道分离。

# 通道分离b,g,r=cv2.split(img)# 换下位置 合并  再用matplotlib显示img_new=cv2.merge([r,g,b])# 前面这三个参数,代表 2行3列布局,当前图位于第一个plt.subplot(2,3,1),plt.imshow(img_new,"gray"),plt.title("ORIGINAL")# 2行3列布局,当前图位于第二个  可以不加逗号plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("REPLICATE")plt.subplot(233),plt.imshow(reflect,"gray"),plt.title("REFLECT")plt.subplot(234),plt.imshow(reflect_101,"gray"),plt.title("REFLECT_101")plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("WRAP")plt.subplot(236),plt.imshow(constant,"gray"),plt.title("CONSTANT")plt.show()

可以看到,图像颜色正常了(我就不每个都处理了,明白用法即可)

数值计算

import cv2import matplotlib as pltimport numpy as npimg_cat=cv2.imread("cat.png")# 这里对图像做数值加法  其实就是对每个像素+10  这和numpy的矩阵加法是一样的# 如果加法完了超过了255 那就把结果对256取模 %cv2.imshow("ans",img_cat+10)cv2.waitKey(0)# opencv里面的图像相加与刚才numpy那种加法不一样img=cv2.imread("test.jpg")# 这个加法会把两个图像的对应像素相加 若超过255 则直接置为255# 注意这样相加必须要求两个图象大小一致print(cv2.add(img,img_cat))

图像融合以及重新设置大小

两个图必须一样大小才能融合

import cv2import matplotlib.pyplot as pltimport numpy as npimg_cat=cv2.imread("cat.png")img_dog=cv2.imread("dog.png")print(img_dog.shape)print(img_cat.shape)# resize 重新设置大小img_cat = cv2.resize(img_cat,(435,400))print(img_cat.shape)# 图像相加的公式是 R=a*x1+b*x2+c    x1 x2代表两个图像  a b是两个参数 c是偏置项# 这里a=0.4 b=0.6 c=0res = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)plt.imshow(res)plt.show()# 大小设置为0 0  fx和fy分别代表x方向拉长几倍 y方向拉长几倍# res = cv2.resize(img_cat,(0,0),fx=1,fy=2)# plt.imshow(res)# plt.show()

结果(变蓝色是因为通道的问题)

阈值

ret,dst = cv2.threshold(src,thresh,maxval,type)src 输入图 只能输入单通道图,一般为灰度图dst 输出图thresh 阈值maxval 当像素值超过了阈值(小于阈值,根据type来决定),就赋值为maxvaltype 二值化的操作 包含以下五种类型cv2.THRESH_BINARY  超过阈值的部分赋值为maxval 否则取0cv2.THRESH_BINARY_INV THRESH_BINARY的反转(本来比如是大于127的赋值为255,反转就是小于127的赋值为255)cv2.THRESH_TRUNC 大于阈值部分设置为阈值 否则不变cv2.THRESH_TOZERO 大于阈值部分不改变 否则设置为0cv2.THRESH_BINARY_INV THRESH_TOZERO的反转

代码:

# 读进来灰度图img=cv2.imread("cat.png",cv2.IMREAD_GRAYSCALE)# 阈值为127 像素超过127就取255 否则取0ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)titles=["Original","THRESH_BINARY","THRESH_BINARY_INV","THRESH_TRUNC","THRESH_TOZERO","THRESH_TOZERO_INV"]images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]for i in range(6):    plt.subplot(2,3,i+1),plt.imshow(images[i],"gray")    plt.title(titles[i])    plt.xticks([]),plt.yticks([])plt.show()

解释下这个plt.imshow(images[i],"gray")
plt.imshow(images,cmap)images是要绘制的图像或数组,cmap是颜色图谱,默认绘制RGB颜色空间,也可以设定gray代表黑-白
显示效果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123590.html

相关文章

  • Android For OpenCV的环境搭建

    摘要:是一个基于许可开源发行的跨平台计算机视觉库,可以运行在和操作系统上。后期将进一步完善其学习记录。为了确保工程创建成功,我们可以重新一下工程载入我们在的回调函数中异步初始化,代码很简单,一句话加上一个回调。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 ...

    gnehc 评论0 收藏0
  • 【评论区送书】使用 Python 和 OpenCV 对图像进行加水印

    摘要:水印有意在图像上留下文本标志,很多博主会使用水印来保护图像的版权。使用水印我们可以确保图像的所有者是在图像上印制水印的人。全书分为篇,共章。理论和实践相结合。 ? ...

    doodlewind 评论0 收藏0
  • Mac下安装node-opencv

    摘要:安装一个包也需要写成文章既然你看到这了你就知道是啥东西就不介绍了啊是在的基础上封装了一层使用时会调用底层的使用编写的来实现图像处理的功能所以不单单的安装一个包各种尝试说实话这块才是最头痛的事如果你搜索安装你能搜到很多结果但是他们好像都串通 安装一个node包也需要写成文章? 既然你看到这了, 你就知道opencv是啥东西, 就不介绍了啊, node-opencv是在opencv的基础上...

    lavor 评论0 收藏0
  • 数字图像处理:图像直方图基础知识介绍

    摘要:如果所有组的组距相同的直方图称为均匀直方图,否则称为非均匀直方图。但在图像处理中基于图像像素值的直方图是最常见的。对于缺乏基础的同仁,可以通过老猿的免费专栏专栏基础教程目录从零开始学习。 ...

    AdolphLWQ 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • Python+OpenCV 图像风格迁移(模仿名画)

    摘要:我最近才发现在的代码中就有图像风格迁移的示例原谅我的后知后觉,是基于论文中的网络模型实现。中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。 现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了 模仿名画风格 的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。 showImg(https:...

    DoINsiSt 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<