python opencv 的基本操作
1.读取图片并打印
import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img=cv2.imread('C:\learn\MarkDown\anconda\lena.png')
img
2.显示一张图片
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destoryAllWindows()
3.使用函数显示一张图片
def cv_show(name,img): # 定义函数加:
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.读取图像
# cv2.IMREAD_GRAYSCALE:灰度图像
# cv2.IMREAD_COLOR: 彩色图像
img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png',cv2.IMREAD_COLOR)
img
img.shape #显示图像类型(h,w,c)
5.读取带写入灰度图
# cv2.IMREAD_GRAYSCALE:灰度图像
# cv2.IMREAD_COLOR: 彩色图像
img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
cv2.waitKey(3000)
cv2.destroyAllWindows()
cv2.imwrite(r'C:\learn\MarkDown\anconda\mylen_gray.png',img)
6.读取视频
# 读取视频
video = cv2.VideoCapture(r'C:\learn\ffmpeg-7.1-full_build-shared\bin\1.mp4')
if video.isOpened():
open,frame=video.read()
else:
open = False
while open:
ret,frame = video.read()
if frame is None:
break;
if ret == True:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('result',gray)
if cv2.waitKey(10) & 0xFF==27:# 27是退出键
break;
video.release()
cv2.destroyAllWindows()
7.截取部分图像
img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png')
img_ry = img[0:50,0:200] #读取h==50 w==200的图像
cv_show('cat',img_ry)
8.颜色通道读取
b,g,r=cv2.split(img)
b
9.合并通道
cv2.merge(b,g,r)
10.读取对应颜色通道显示
cur_img = img.copy()
cur_img[:,:,0]=0 # :表示取所有,意思是h,w,取所有值。[h,w,c] c代表b,g,r 索引0代表B
cur_img[:,:,1]=0
cv_show('r',cur_img) # 所以该图显示是为红色图
cur_img = img.copy()
cur_img[:,:,0]=0 # :表示取所有,意思是h,w,取所有值。[h,w,c] c代表b,g,r 索引0代表B
cur_img[:,:,2]=0 #:表示取所有,意思是h,w,取所有值。[h,w,c] c代表b,g,r 索引0代表R
cv_show('r',cur_img) # 所以该图显示是为绿色图
11.边界填充
import cv2
img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png')
top_size,bottom_size,left_size,right_size=(50,50,50,50)
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE) #复制
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT) #反射
reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101) # 反射
wrap=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP) #外包装
const=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0) #常量填充
#分类型显示图像
import cv2
import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGIN')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLACT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT101')
plt.subplot(236),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(235),plt.imshow(const,'gray'),plt.title('ORIGIN')
plt.show()
BORDER_REPLICATE 复制法:复制最边缘的像素点
BORDER_REFLECT: 反射法:对感兴趣的像素在两边复制:fedcba|abcdefgh|hgfedcb
|<-----| |------->
直接反转,类似与镜面反射
BORDER_REFLECT_101:反射法:以最边缘的像素为轴 gfedcb|abcdefgh|gfedcba
以a,h为轴,将两边像素去掉,左边去掉a反转,右边去掉g反转
BORDER_WRAP:外包装法:cdefgh|abcdefgh|abcdefg
直接套装
BORDER_CONSTANT:常量法:常量填充
12.数值计算
img_lena = cv2.imread(r'C:\learn\MarkDown\anconda\lena.png')
img_lena2 = img_lena+10 #超过255值,取余
img_lena2[:5,:,0] #只显示前5行
cv2.add(img_lena,img_lena2)[:5,:,0] #add 函数大于255,取最大值
13.图像融合
- 先将两张图片resize成大小和通道相同
- 按比例融合(res=ax+by+Z)
img_trimp = cv2.resize(img_trimp,(512,512))
img_trimp.shape
res=cv2.addWeighted(img_lena,0.4,img_trimp,0.6,0)
plt.imshow(res)
img_trimp = cv2.resize(img_trimp,(512,512))
img_trimp.shape
res=cv2.addWeighted(img_lena,0.4,img_trimp,0.6,0)
plt.imshow(res)