01_opencv_python_基本图像处理

1  图像基本操作

 

1.0.1  环境配置地址:

 

1.1  数据读取-图像

  • cv2.IMREAD_COLOR:彩色图像
  • cv2.IMREAD_GRAYSCALE:灰度图像
import cv2  # opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np 
%matplotlib inline 

# img读入的本质上就是数组 img
= cv2.imread(cat.jpg)
#图像的显示,也可以创建多个窗口
cv2.imshow(image,img) 
# 等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0) 
cv2.destroyAllWindows()

我们来将上述图像显示代码封装成一个函数

def cv_show(name,img):
    cv2.imshow(name,img) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows()

我们可以看看图像的各种基本信息

print(img.shape)  # 图片形状(h,w,c)

# 读取灰度图 -->通道数 c == 1
img=cv2.imread(cat.jpg,cv2.IMREAD_GRAYSCALE)
img

# 看看图片的类型  numpy.ndarray
type(img)

# 图片的size = h * w * c
img.size

# 图片中数据的类型 比如uint8 float32
img.dtype

保存图片

# (‘路径/保存图片名字‘,要保存的图片
cv2.imwrite(mycat.png,img)  

1.2  数据读取-视频

  • cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
  • 如果是视频文件,直接指定好路径即可。
vc = cv2.VideoCapture(test.mp4)
# 检查是否打开正确
if vc.isOpened(): 
    oepn,frame = vc.read()
else:
    open = False
while open:
    ret,frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow(result,gray)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

 

1.3  录制视频

import cv2#导入opencv包
 
video=cv2.VideoCapture(0)#打开摄像头
 
fourcc = cv2.VideoWriter_fourcc(*XVID)#视频存储的格式
fps = video.get(cv2.CAP_PROP_FPS)#帧率
#视频的宽高
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter(video.avi,fourcc,fps,size)#视频存储
 
while out.isOpened():
    ret,img=video.read()#开始使用摄像头读数据,返回ret为true,img为读的图像
    if ret is False:#ret为false则关闭
        exit()
    cv2.namedWindow(video,cv2.WINDOW_AUTOSIZE)#创建一个名为video的窗口
    cv2.imshow(video,img)#将捕捉到的图像在video窗口显示
    out.write(img)#将捕捉到的图像存储
    #按esc键退出程序
    if cv2.waitKey(1) & 0xFF ==27:
        video.release()#关闭摄像头
        break

1.4  截取部分图像数据

img=cv2.imread(cat.jpg)

cat=img[0:100,0:200]
cv_show(cat,cat)

1.5  色彩空间API

def color_space_demo(src):
    img = cv2.imread(src)
    # 转成灰度图
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv_show("gray",gray)
    # 转成HSV
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv_show(hsv,hsv)
    # hsv转成rgb(bgr)
    img = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    cv_show(hcv2img,img)
    # yuv...也可以转

1.5.1  基于颜色提出目标(先转成hsv格式)

分享图片

 

 

分享图片

 

 

def extrace_object_demo(src):
    img = cv2.imread(src)  # 通道数是3
    # print(img.shape)
    img_binary = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 通道数是 1
    # print(img_binary.shape)
    
    # 1.将RGB转换成HSV色彩空间
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    # print(hsv.shape)
    
    # 2.定义数组,说明你要提取(过滤)的颜色目标
    # 三通道,所以是三个参数
    # 红色
    lower_hsv_r = np.array([156,43,46])
    upper_hsv_r = np.array([180,255,255])   
    
    # 3.进行过滤,提取,得到二值图像
    mask_red = cv2.inRange(hsv,lower_hsv_r,upper_hsv_r)  # 通道数是 1 
    # print(mask_red.shape)
    
    # 4.展示成果
    cv_show(original,img)
    cv_show(mask_red,mask_red)
    
    # 5.合并展示
    res = np.hstack((img_binary,mask_red))
    cv_show("hastck",res)
    
    return mask_red

1.6  颜色通道提取与合并

# 提取
b,g,r=cv2.split(img)
print(b.shape)
# 合并
img = cv2.merge((b,r))
print(img.shape)
# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,1] = 0
cv_show(R,cur_img)

1.7  边界填充

  • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
  • BORDER_CONSTANT:常量法,常数值填充。
top_size,bottom_size,left_size,right_size = (50,50,50)

replicate = cv2.copyMakeBorder(img,top_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,cv2.BORDER_CONSTANT,value=0)
import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,gray),plt.title(ORIGINAL)
plt.subplot(232),plt.imshow(replicate,plt.title(REPLICATE)
plt.subplot(233),plt.imshow(reflect,plt.title(REFLECT)
plt.subplot(234),plt.imshow(reflect101,plt.title(REFLECT_101)
plt.subplot(235),plt.imshow(wrap,plt.title(WRAP)
plt.subplot(236),plt.imshow(constant,plt.title(CONSTANT)

plt.show()

分享图片

 

 

1.8  图像融合

必须保证要融合的图片shape一致

img_cat=cv2.imread(cat.jpg)
img_dog=cv2.imread(dog.jpg)

img_cat + img_dog
# ValueError: operands Could not be broadcast together with shapes (414,500,3) (429,499,3) 

# 将狗狗的图片和猫猫的图片resize一样
img_dog = cv2.resize(img_dog,(500,414))

# 选择融合的权重
res = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)

# 展示结果
plt.imshow(res)

分享图片

 

 

进一步演示resize的用法

# 将猫猫的图片放大
res = cv2.resize(img,(0,0),fx=4,fy=4)
plt.imshow(res)

分享图片

 

 

res = cv2.resize(img,fx=1,fy=3)
plt.imshow(res)

分享图片

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...