草庐IT

opencv 图像和视频处理的基本操作(python)

mingrufeng 2023-09-28 原文

1 图片的获取

  主要通过cv2.imread(src)函数进行获取

 #获取图片,请注意更改路径 支持绝对路径,该函数产生的图片灰度系数数组
img = cv2.imread('Sunrise.jpg');
#获取灰度图
img_gray = cv2.imread('C:/Users/10275/Pictures/Sunrise.jpg',cv2.IMREAD_GRAYSCALE)

2 图片的显示

1 def cv_show(name,img):
2     #第一个参数是窗口的名字,随便取,第二个是需要展示图片的灰度系数数组
3     cv2.imshow(name,img) 
4     #参数为图片显示的时间,单位是毫秒,0是任意键关闭图片
5     cv2.waitKey(0) 
6     #关闭所有窗口
7     cv2.destroyAllWindows()
8     #保存图片
9     #cv2.imwrite(name,img)

3 获取图片的部分

#图片截图
img_part = img[0:100,0:100] 

4 图片的RGB通道划分

  注意cv2.imread()获取的图片通过顺序为BGR,而非RGB,即B为0,G为1,R为2

 1 #切分为三通道
 2 b,g,r = cv2.split(img)
 3 
 4 #只保留R通道
 5 cur_Rimg = img.copy()
 6 cur_Rimg[:,:,0] = 0 #将B通道关闭
 7 cur_Rimg[:,:,1] = 0 #将G通道关闭
 8 cv_show('R',cur_Rimg)
 9 
10 #只保留G通道
11 cur_Gimg = img.copy()
12 cur_Gimg[:,:,0] = 0
13 cur_Gimg[:,:,2] = 0
14 cv_show('G',cur_Gimg)
15 
16 #只保留B通道
17 cur_Bimg = img.copy()
18 cur_Bimg[:,:,1] = 0
19 cur_Bimg[:,:,2] = 0
20 cv_show('B',cur_Bimg)

 5 RGB通道合成

#将三通道合成为一个图片
img = cv2.merge((b,g,r)) 

6 边界填充

  主要是通过cv2.copyMakeBorder(src, top_size,bottom_size,left_size,right_size,borderType)函数进行

  src:原图片

  top_size.top_size,bottom_size,left_size,right_size:为上下左右方向的填充宽度

  borderType:填充的方法

  具体效果自己尝试

 1 top_size,bottom_size,left_size,right_size = (100,100,100,100)
 2 #复制法,复制最边缘的像素
 3 replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
 4 #反射法,按照边界进行反射 如abcdefgh | hgfedcba
 5 reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
 6 #反射101法,按照边缘进行反射 相当于去掉了反射法的边界重复值 abcdefg | fedcba
 7 reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
 8 #平铺法,图像反复重复
 9 wrap  = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
10 #常量法,常数值填充
11 constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT)
12 
13 plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGIN')
14 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('Replicate')
15 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('Reflect')
16 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('Reflect101')
17 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('Wrap')
18 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('Constant')
19 plt.show()

7 数值的计算

1 #灰度系数的加10
2 img2 = img + 10
3 print(img[:5,:,0])
4 print(img2[:5,:,0])
5 #当灰度超过255时候 会将值对256取模
6 print(img+img2[:5,:,0])
7 #使用cv2的add时候 灰度系数达到255时,则不再取模 而是直接使用255
8 print(cv2.add(img,img2)[:5,:,0])

8 图片的融合

1 #注意此处相加 如果两个图片的宽高比不同,则无法相加
2 #print(img + img2)
3 #若是两个图片宽高不同则事先需要进行resize 后面的500,414是来源于 img.shape的值
4 img2 = cv2.resize(img2,(500,414))
5 #宽度拉伸3倍,高度不变
6 img4 = cv2.resize(img,(0,0),fx=3,fy=1)
7 #图片融合 公式为 R = αimg1+βimg2+b  其中 α为img1在融合后图的权重,β为img2在融合图后的权重,b是增加灰度
8 res = cv2.addWeighted(img,0.4,img2,0.6,0)

9 图像的阈值

  ret,dst = cv2.threshold(src,thresh,maxval,type)

  • ret:返回的阈值
  • dst:返回的图像
  • src:已通过cv2,read获取的图片
  • thresh:设定的阈值 一般为127 为0~255的中间
  • maxval:当像素值超过了阈值,所赋予的值
  • type:二值化操作的类型
#超过阈值的部分去maxval,否则取0
ret,thresh1 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
#Thresh_Binary的反转
ret,thresh2 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
#大于阈值部分设为阈值,否则不变
ret,thresh3 = cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
#大于阈值部分不变,否则为0
ret,thresh4 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
#Thresh_Tozero的反转
ret,thresh5 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)

tiles = ['Origin','Binary','Binary_Inv','Trunc','ToZero','ToZero_Inv']
images = [img_gray,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(tiles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

10 视频的获取和显示

 

 1 #视频读取
 2 vc = cv2.VideoCapture('test.mp4')
 3 
 4 #检测视频是否正常打开
 5 if vc.isOpened():
 6     open,frame = vc.read() #返回第一个参数为bool值用于检测该帧是否正常打开,第二个参数为该帧的图片
 7 else:
 8     open = False
 9 #循环读取视频
10 while open:
11     ret,frame = vc.read()
12     if frame is None: #如果该帧内容为空说明视频抵达最后,则跳出循环
13         break
14     if ret == True: #如果ret返回True 说明已经正常打开该帧
15         gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #直接将该帧转换为灰度图像
16         cv2.imshow('result',gray) #每帧的展示
17         if cv2.waitKey(10) & 0xFF == 27: #每帧的持续时长 和 退出视频按键
18             break
19 vc.release() #释放资源
20 cv2.destroyAllWindows() #关闭全部窗口

 

  

有关opencv 图像和视频处理的基本操作(python)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  4. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐