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

图像基本操作

文章目录

      • 图像基本操作
        • 数据读取-图
        • 数据读取-视视频
        • ROI (Region of interst)-截去部分图像数据
        • 改变图像的大小
          • 简单的图像融合
        • 颜色通道截取
        • 边界填充

Python-opencv-学习笔记(1)-图像基本操作_第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)
r e s = s r c 1 × α + s r c 2 × β + γ res= src_1\times\alpha+src_2\times\beta+\gamma res=src1×α+src2×β+γ

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)

你可能感兴趣的:(学习笔记)