翼度科技»论坛 编程开发 python 查看内容

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

14

主题

14

帖子

42

积分

新手上路

Rank: 1

积分
42
1 图片的获取
  主要通过cv2.imread(src)函数进行获取
  1. #获取图片,请注意更改路径 支持绝对路径,该函数产生的图片灰度系数数组
  2. img = cv2.imread('Sunrise.jpg');
  3. #获取灰度图
  4. img_gray = cv2.imread('C:/Users/10275/Pictures/Sunrise.jpg',cv2.IMREAD_GRAYSCALE)
复制代码
2 图片的显示
  1. 1 def cv_show(name,img):
  2. 2     #第一个参数是窗口的名字,随便取,第二个是需要展示图片的灰度系数数组
  3. 3     cv2.imshow(name,img)
  4. 4     #参数为图片显示的时间,单位是毫秒,0是任意键关闭图片
  5. 5     cv2.waitKey(0)
  6. 6     #关闭所有窗口
  7. 7     cv2.destroyAllWindows()
  8. 8     #保存图片
  9. 9     #cv2.imwrite(name,img)
复制代码
3 获取图片的部分
  1. #图片截图
  2. img_part = img[0:100,0:100]
复制代码
4 图片的RGB通道划分
  注意cv2.imread()获取的图片通过顺序为BGR,而非RGB,即B为0,G为1,R为2
  1. 1 #切分为三通道
  2. 2 b,g,r = cv2.split(img)
  3. 3
  4. 4 #只保留R通道
  5. 5 cur_Rimg = img.copy()
  6. 6 cur_Rimg[:,:,0] = 0 #将B通道关闭
  7. 7 cur_Rimg[:,:,1] = 0 #将G通道关闭
  8. 8 cv_show('R',cur_Rimg)
  9. 9
  10. 10 #只保留G通道
  11. 11 cur_Gimg = img.copy()
  12. 12 cur_Gimg[:,:,0] = 0
  13. 13 cur_Gimg[:,:,2] = 0
  14. 14 cv_show('G',cur_Gimg)
  15. 15
  16. 16 #只保留B通道
  17. 17 cur_Bimg = img.copy()
  18. 18 cur_Bimg[:,:,1] = 0
  19. 19 cur_Bimg[:,:,2] = 0
  20. 20 cv_show('B',cur_Bimg)
复制代码
 5 RGB通道合成
  1. #将三通道合成为一个图片
  2. 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. 1 top_size,bottom_size,left_size,right_size = (100,100,100,100)
  2. 2 #复制法,复制最边缘的像素
  3. 3 replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
  4. 4 #反射法,按照边界进行反射 如abcdefgh | hgfedcba
  5. 5 reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
  6. 6 #反射101法,按照边缘进行反射 相当于去掉了反射法的边界重复值 abcdefg | fedcba
  7. 7 reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
  8. 8 #平铺法,图像反复重复
  9. 9 wrap  = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
  10. 10 #常量法,常数值填充
  11. 11 constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT)
  12. 12
  13. 13 plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGIN')
  14. 14 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('Replicate')
  15. 15 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('Reflect')
  16. 16 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('Reflect101')
  17. 17 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('Wrap')
  18. 18 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('Constant')
  19. 19 plt.show()
复制代码
7 数值的计算
  1. 1 #灰度系数的加10
  2. 2 img2 = img + 10
  3. 3 print(img[:5,:,0])
  4. 4 print(img2[:5,:,0])
  5. 5 #当灰度超过255时候 会将值对256取模
  6. 6 print(img+img2[:5,:,0])
  7. 7 #使用cv2的add时候 灰度系数达到255时,则不再取模 而是直接使用255
  8. 8 print(cv2.add(img,img2)[:5,:,0])
复制代码
8 图片的融合
  1. 1 #注意此处相加 如果两个图片的宽高比不同,则无法相加
  2. 2 #print(img + img2)
  3. 3 #若是两个图片宽高不同则事先需要进行resize 后面的500,414是来源于 img.shape的值
  4. 4 img2 = cv2.resize(img2,(500,414))
  5. 5 #宽度拉伸3倍,高度不变
  6. 6 img4 = cv2.resize(img,(0,0),fx=3,fy=1)
  7. 7 #图片融合 公式为 R = αimg1+βimg2+b  其中 α为img1在融合后图的权重,β为img2在融合图后的权重,b是增加灰度
  8. 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:二值化操作的类型
  1. #超过阈值的部分去maxval,否则取0
  2. ret,thresh1 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
  3. #Thresh_Binary的反转
  4. ret,thresh2 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
  5. #大于阈值部分设为阈值,否则不变
  6. ret,thresh3 = cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
  7. #大于阈值部分不变,否则为0
  8. ret,thresh4 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
  9. #Thresh_Tozero的反转
  10. ret,thresh5 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)
  11. tiles = ['Origin','Binary','Binary_Inv','Trunc','ToZero','ToZero_Inv']
  12. images = [img_gray,thresh1,thresh2,thresh3,thresh4,thresh5]
  13. for i in range(6):
  14.     plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
  15.     plt.title(tiles[i])
  16.     plt.xticks([]),plt.yticks([])
  17. plt.show()
复制代码
10 视频的获取和显示
 
  1. 1 #视频读取
  2. 2 vc = cv2.VideoCapture('test.mp4')
  3. 3
  4. 4 #检测视频是否正常打开
  5. 5 if vc.isOpened():
  6. 6     open,frame = vc.read() #返回第一个参数为bool值用于检测该帧是否正常打开,第二个参数为该帧的图片
  7. 7 else:
  8. 8     open = False
  9. 9 #循环读取视频
  10. 10 while open:
  11. 11     ret,frame = vc.read()
  12. 12     if frame is None: #如果该帧内容为空说明视频抵达最后,则跳出循环
  13. 13         break
  14. 14     if ret == True: #如果ret返回True 说明已经正常打开该帧
  15. 15         gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #直接将该帧转换为灰度图像
  16. 16         cv2.imshow('result',gray) #每帧的展示
  17. 17         if cv2.waitKey(10) & 0xFF == 27: #每帧的持续时长 和 退出视频按键
  18. 18             break
  19. 19 vc.release() #释放资源
  20. 20 cv2.destroyAllWindows() #关闭全部窗口
复制代码
 
  

来源:https://www.cnblogs.com/mingrufeng/p/17340854.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具