欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python-opencv-学习笔记(1)-图像基本操作

程序员文章站 2022-03-05 15:00:36
...

图像基本操作


Python-opencv-学习笔记(1)-图像基本操作

数据读取-图

转换为灰度图的不同方式

  • img_gray = cv2.imread(’…/…/pic/cat.jpg’, cv2.IMREAD_GRAYSCALE)
  • img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

相对路径

/” :表示根目录,在windows系统下表示某个盘的根目录,如“E:\”;

./”:表示当前目录;(表示当前目录时,也可以去掉“./”,直接写文件名或者下级目录)
…/”:表示上级目录

img = cv2.imread('../../pic/cat.jpg')
cv2.imshow('cat', img)
img_gray = cv2.imread('../../pic/cat.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('cat_gray', img_gray)
img_gray2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('cat_gray2', img_gray2)
print(img.shape)
cv2.waitKey(0)  # 按任意键退出显示
cv2.destroyAllWindows()
printf(Img.shape)
# OUT: (414, 500, 3)
# 图像保存
cv2.imwrite('mycat.jpg',img)

数据读取-视视频

def show_video():
    vc = cv2.VideoCapture('../../pic/test.mp4')
    # 检查能否正确打开
    if vc.isOpened():
        ret_val, frame1 = vc.read()
    else:
        ret_val = False
    while ret_val:
        ret, frame = vc.read()
        if frame is None:
            break
        if ret is True:
            cv2.imshow('result', frame)
            # 等待或者按退出键退出
            if cv2.waitKey(120) & 0xff == 27:
                break
    vc.release()
    cv2.destroyAllWindows()

如果想要显示电脑内置摄像头的视频,只需要把 vc = cv2.VideoCapture(’…/…/pic/test.mp4’) 改为

vc = cv2.VideoCapture(0) 既可。

关于wait_key()

  • wait_key(10) 表示等待10ms后关闭
  • wait_key(0) 表示始终显示

ROI (Region of interst)-截去部分图像数据

img = cv2.imread('cat.jpg')
cat = img[0:200,0:200]
cv_show('cat',cat)

改变图像的大小

# 将img的图像变为30✕30
img_small = cv2.resize(img,(30,30))

# 将img的图像沿x方向扩大3倍,y方向不变
img_big = cv2.resize(img,(0,0),fx=3,fy=1)
简单的图像融合

res = addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
res=src1×α+src2×β+γres= src_1\times\alpha+src_2\times\beta+\gamma

cat = cv2.imread('../../pic/cat.jpg')
dog = cv2.imread('../../pic/dog.jpg')
# 对图像进行尺寸的调整
cat = cv2.resize(cat, (300, 300))
dog = cv2.resize(dog, (300, 300))
# 以一定的比例进行加和
res = cv2.addWeighted(cat, 0.6, dog, 0.5, 0)
cv2.imshow('cat + dog', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

颜色通道截取

b,g,r = cv2.split(img)
#or
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

note: opencv中的颜色通道顺序为BGR,而不是我们通常所说的RGB

边界填充

copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)

borderType:扩充边缘的类型, OpenCV 中给出以下几种方式 :

  • BORDER_REPLICATE 复制法,复制最边缘的像素,例如:aaaa|abcdefg|ggggg
  • BORDER_REFLECT 反射法,即以最边缘的像素为对称轴。例如:fedcba|abcdefg|gfedec
  • BORDER_REFLECT_101 反射法,也是最边缘的像素为对称轴,但与BORDER_REFLECT有区别。例如:fedcb|abcdefg|fedec
  • BORDER_WRAP 外包装法,即以图像的左边界与右边界相连,上下边界相连。例如:cdefgh|abcdefgh|abcdefg
  • BORDER_CONSTANT 常量法 ,常数值填充
# 上下左右填充的大小
top_size, bottom_size, left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,boarderType=cv2.BORDER_REPLICATE)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,boarderType=cv2.BORDER_CONSTANT,value=0)