opencv入门学习

import cv2 as cv
import numpy as np
from PIL import Image

1、读取图片

imread函数有两个参数,(1)第一个参数是图片路径,(2)第二个参数表示读取图片的形式:cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1;cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0;cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1)

img_path="./images/cat.png"
img=cv.imread(img_path)

用PIL包(pip install Pillow)也可以读取图片

img=Image.open(img_path)

*** 两种方式的返回值不一样,opencv读取图片返回的是numpy.ndarray格式,PIL.Image返回的是PIL.PngImagePlugin.PngImageFile一个PIL Image对象,两者可以互相转换,这里就不详细介绍了。

2、修改图片尺寸

dst = cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

opencv入门学习_第1张图片

img=cv.resize(img,dsize=(0,0),fx=0.2,fy=0.2)   ##按照0.2的比例缩小
img=cv.resize(img,dsize=(200,300))             ##缩放后的尺寸为(200,300)

3、视频处理

(1)读取视频

video_path="./images/test.mp4"
#video=cv.VideoCapture(0)  打开电脑摄像头,0代表使用默认的摄像头
video=cv.VideoCapture(video_path)

(2)一帧一帧的读取视频

frames=[]
while True:
    nextf,frame=video.read() #按视频顺序读每一帧
    if nextf:
        frames.append(frame)
    else:
        break 

查看任意一帧的图像

cv.imshow("img",frames[6])   #查看第6帧的图像

4、高斯模糊

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。[1]通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片, 但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板, 来初始化得到如假包换的目标图。

ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数 (并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。

sigmaX,表示高斯核函数在X方向的的标准偏差。 sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX, 如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。

gas_img=cv.GaussianBlur(img,ksize=(15,15),sigmaX=10)
##ksize和sigmaX的值越大,模糊效果越强。ksize的值为二元向量,且值为奇数。

opencv含有四个滤波器,下面给出例子就不详细介绍了(注意opencv只能处理BGR格式)

blur=cv2.blur(np.array(img),(5,5))#均值滤波
#只能接受array格式
##或者 blur=cv2.blur(img_to_array,(5,5))   img0=img_to_array
blur0=cv2.medianBlur(blur,5)#中值滤波
blur1=cv2.GaussianBlur(blur0,(5,5),0)#高斯滤波
blur2=cv2.bilateralFilter(blur1,9,75,75)#双边滤波

5、边缘提取

采用 Canny 算法做边缘检测,函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

img=cv.imread("./images/bird.png") 
can_img=cv.Canny(image=img, threshold1=200, threshold2=250)
 #threshold为检测边缘是否存在的阈值,可以调整来控制图片或视频的输出结果。

opencv入门学习_第2张图片

6、膨胀与侵蚀效果

主要是采用 cv2.erode() 和 cv2.dilate(),需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分

(1)腐蚀(erode):在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则都为0,来达到瘦身的目的。因此在下面的例子中,我们就可以使用腐蚀来将图片中的一些毛刺或者说很细小的东西给去掉。

name_img=cv.imread("./images/name.png")
erode_img=cv.erode(name_img,kernel=np.ones((5,5),np.uint8),iterations=1) 

(2)膨胀(dilate):就是取得局部最大值,效果是“变胖”,我们可以直接操作腐蚀例子中的腐蚀过的图像erosion。为了效果明显一点,我们的iterations 参数取值大一点,设置为3

dilate_img=cv.dilate(erode_img,kernel=np.ones((5,5),np.uint8),iterations=5) 

7、画线和文字

画线、画长方形.......

draw_img=np.zeros((400,400,3),np.uint8)
cv.line(img=draw_img,pt1=(20,20),pt2=(200,200),color=(255,0,0),thickness=2)
#画长方形还可以画圆
cv.circle(img,(500,500),30,color=(255,0,0),thickness=2)
cv.rectangle(img=draw_img,pt1=(20,20),pt2=(200,200),color=(0,255,0),thickness=cv.FILLED)
img_show=Image.fromarray(draw_img)
img_show

 添加文字cv.putText(图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细)

cv.putText(draw_img,"NICE !!",(300,300),cv.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)

opencv入门学习_第3张图片

你可能感兴趣的:(opencv,学习,计算机视觉)