opencv-python教程学习1

1、opencv读取图片步骤:

  • 使用imread()函数读取一张图片。

    • cv2.imread(path,flag):返回一个从指定地址读取的图片。
    • flag: 有三种形式的flag,分别是:
      • cv2.IMREAD_COLOR,可以使用1来代替这个默认值。
      • cv2.IMREAD_GRAYSCALE,表示读入的图片是灰度图,可以用0来代替。
      • cv2.IMREAD_UNCHANGED。可以用-1代替。
  • 使用 imshow()函数显示图片。

  • 使用函数 waitKey(0)使显示图片窗口停留。

  • import cv2
    img = cv2.imread("road.jpg",cv2.IMREAD_COLOR)#img = cv2.imread("road.jpg",1)
    cv2.imshow("image",img)
    cv2.waitKey(0)
    cv2.destoryAllWindows()
    

2、opencv储存图片

  • 使用cv2.imwrite()函数存储图片到指定位置。返回布尔类型。

  • cv2.imwrite(filename,image)
    filename:字符串表示图片名字,需要包含后缀.jpg,.png等等
    image:要被保存的图片
    return value:图片保存成果返回true
    
    #图片路径
    image_path = r'C:\\Users\\dell\\PycharmProjects\\learnOpencv\\add_s.jpg'
    directory = r'C:\\Users\\dell\\PycharmProjects\\learnOpencv'
    #读取并加载图片
    img = cv2.imread(image_path)
    os.chdir(directory) #切换保存空间
    
    print("before saving image:")
    print(os.listdir(directory))
    #写入并保存图片
    filename = 'savedImage.png'
    cv2.imwrite(filename,img)
    
    print("after saving iamge:")
    print(os.listdir(directory))
    
    print('sucessfully saved')
    

3、opencv中的色彩空间

# 读入图片
image = cv2.imread('RGB_paint.png')
B, G, R = cv2.split(image) #将三个色彩通道分开

cv2.imshow("original",image)
cv2.waitKey(0)
#分别显示三通道颜色
cv2.imshow("blue", B)
cv2.waitKey(0)

cv2.imshow("Green", G)
cv2.waitKey(0)

cv2.imshow("red", R)
cv2.waitKey(0)

cv2.destroyAllWindows()

4、位运算图片操作

4.1 Bitwise_and:按位与
  • cv2.bitwise_and(scr1, scr2, destination, mask) 计算两个图片像素按位与:dest = scr1 & scr2
    cv2.bitwise_or(scr1,scr2,destination, mask) 按位或计算两个图片的值
    cv2.bitwise_xor(scr1,scr2,destination,mask) 按位异或计算两个图片的值
    dest_and = cv2.bitwise_not(image1, image2) 按位否
    scr1:第一个输入图片数组
    scr2:第二个输入图片数组
    dest:输出图片数组
    mask:操作规则
    
  • image1 = cv2.imread('img.png')
    print(image1.shape) # (250, 499, 3)
    cv2.imshow('image1',image1)
    cv2.waitKey(0)
    
    image2 = cv2.imread('img_1.png')
    print(image2.shape) # (250, 499, 3)
    cv2.imshow('image2', image2)
    cv2.waitKey(0)
    
    # 像素值按位与操作
    dest_and = cv2.bitwise_and(image1,image2)
    cv2.imshow('Bitwise_and',dest_and)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    dest_or = cv2.bitwise_or(image1, image2)
    cv2.imshow('Bitwise_or', dest_or)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    dest_xor = cv2.bitwise_xor(image1, image2)
    cv2.imshow('Bitwise_xor', dest_xor)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    dest_not = cv2.bitwise_not(image1, image2)
    cv2.imshow('Bitwise_not', dest_not)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

4.3 opencv调整图片大小

  • 调整大小插值方法:
    cv2.INTER_AREA:缩小图片
    cv2.INTER_CUBIC:双三次插值
    cv2.INTER_LINEAR:opencv默认的插值技术,线性插值
    
  • cv2.resize(src, dst, dst.size(), 0, 0, interpolation))
    src:源图片
    dst:默认值为None
    dst.size():输出图片的大小
    fx,fy:水平垂直方向放缩倍数
    interpolation:插值方法
    
  • image = cv2.imread("add_s.jpg")
    print(image.shape) #(250, 500, 3)
    
    half = cv2.resize(image,(0,0),fx= 0.1,fy=0.1) # (25, 50, 3)
    bigger = cv2.resize(image,(1050,1610)) #(1610, 1050, 3)
    
    stretch_near = cv2.resize(image,(780,540),interpolation=cv2.INTER_NEAREST) #(540, 780, 3)
    
    Titles = ["original","Half","Bigger","Interpolation Nearest"]
    images = [image, half, bigger,stretch_near]
    count = 4
    
    for i in range(count):
        plt.subplot(2,2,i+1)
        plt.title(Titles[i])
        plt.imshow(images[i])
        print(images[i].shape)
        plt.show()
    

4.4 图片侵蚀

  • cv2.erode(src,kernal,dst=None,anchor,iterations)
    src:源图片
    kernal:用于侵蚀的结构元素,如果是个矩阵则使用$3 \times 3$的矩形结构元素
    dst:输出图片
    iterations:迭代次数,用于侵蚀的次数
    返回值:返回一个图像
    
  • image = cv2.imread("add_s.jpg")
    window_name = "Image"
    #创建一个kernal内核,uint类型的5 x 5 的矩阵
    kernal = np.ones((5,5),np.uint8)
    #侵蚀函数, src, kernal 
    image_erode = cv2.erode(image,kernal)
    
    cv2.imshow(window_name,image_erode)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
4.5 图片模糊
  • 定义:模糊图片
    优点:1、去噪,噪声被认为是high pass signal 2、使图片变得光滑 3、低亮度的边界被去除   4、必要时隐藏具体细节
    重要的模糊类型:
    高斯模糊:高斯函数作用下的模糊图像,常用在图片去噪,减少细节,常作为模型输入的预处理阶段,
    cv2.GaussianBlur(src, ksize,sigmax,) ksize:高斯核shape,一般是奇数正数,sigmax:水平方向的高斯标准差
    中间模糊:非线性的数字过滤技术,保存边界同时去噪,是消除噪声的常用算法
    cv2.medianBlur(src,ksize,dst=None):ksize必须是大于1的奇数。使图片光滑的模糊。
    双边模糊:是一个非线性的、保存边界的、去噪的光滑的图片模糊过滤器,使用附近光强权重替换特定像素点的光强,权重可以是高斯分布,尖锐的边界被保存同时丢弃弱的那个。可以去除噪声同时保留边界。
    bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
    d:过滤期间每个像素邻域的直径
    sigmaColor:颜色空间的过滤参数,越大意味着像素领域越远的颜色会混合在一起。
    sigmaSpace:坐标空间过滤sigma,越大意味着相近颜色足够远也能相互影响
    
  • image = cv2.imread("add_s.jpg")
    cv2.imshow("original",image)
    cv2.waitKey(0)
    
    #cv2.GaussianBlur(src, ksize,sigmax,) ksize:高斯核shape,一般是奇数正数,sigmax:水平方向的高斯标准差
    Gaussian = cv2.GaussianBlur(image,(7,7),0)
    cv2.imshow("Gaussian Bluring",Gaussian)
    cv2.waitKey(0)
    
    # cv2.medianBlur(src,ksize,dst=None):ksize必须是大于1的奇数。使图片光滑的模糊。
    median = cv2.medianBlur(image,5)
    cv2.imshow("median Blur", median)
    cv2.waitKey(0)
    
    # cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
    bilaternal = cv2.bilateralFilter(image,9,75,75)
    cv2.imshow("bilaternal Blur", bilaternal)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
4.6 图片周围创建相框
cv2.copyMakeborder(src, top, bottom, left,right, borderType, value)
top:顶部像素的边框宽度
bottom:底部像素的边框宽度
borderType:描述了要添加什么样的边框:
	cv2.BORDER_CONSTANT:添加恒定的彩色边框,值需要value参数给出。
	cv2.BORDER_REFLECT:边界是边界元素的镜像表示,cv2.BORDER_REFLECT_101或cv2.BORDER_REFLECT_DEFAULT
	cv2.BORDER_REPLICATE:(复制):复制最后一个元素,
image = cv2.imread("add_s.jpg")
Window_name = 'Image'
image = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_CONSTANT,value=0)
cv2.imshow(Window_name,image)
cv2.waitKey(0)

image_1 = cv2.copyMakeBorder(image,100,100,50,50,cv2.BORDER_REPLICATE)
Window_name1 = 'Image_reflect'
cv2.imshow(Window_name1,image_1)
cv2.waitKey(0)

image_2 = cv2.copyMakeBorder(image, 100, 100, 50, 50, cv2.BORDER_REPLICATE)
Window_name2 = 'Image_replicate'
cv2.imshow(Window_name2, image_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.7 将图片转为灰度图
  • 灰度转变优点:降维,减小模型复杂度。
    方法一:cv2.cvtColor():使用这个函数将图片转变为灰度图。cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    方法二、cv2.imread(path,flags=0):将图片转为灰度图
    方法三、使用像素操作
    
  • # 图片读入时使用flags = 0将图片转化为灰度图
    image = cv2.imread("add_s.jpg",flags=0)
    cv2.imshow("original",image)
    cv2.waitKey(0)
    # cvtCOLOR()函数将图片转化为灰度图
    gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray",gray_image)
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()
    
4.8 图片的resize(), rotation,rectangle, text,cvtColor.
def main():
    # imread函数读取一张图片
    image = cv2.imread("road.jpg")
    print(type(image))
    print(image.shape)
    # 提取图片的高和宽
    h,w,c = image.shape[:]
    print("Height = {}, width = {}, channel = {}".format(h,w,c))

    (B,G,R) = image[100,100]
    print("R = {}, G = {}, B = {}".format(R,G,B))
    B = image[100, 100, 0]
    print("B = {}".format(B))

    # 指定大小
    resize = cv2.resize(image,(800,800))
    cv2.imshow("imageResize",resize)
    cv2.waitKey(0)

    # 旋转图片
    center = (w // 2, h // 2)
    matrix = cv2.getRotationMatrix2D(center, -45,1.0)
    rotated = cv2.warpAffine(image,matrix,(w,h))

    cv2.imshow("rotaimage", rotated)
    cv2.waitKey(0)

    # 图片上画矩形
    output = image.copy()
    rectangle = cv2.rectangle(output,(1500,900),(600,400),(255,255,255),2)
    cv2.imshow("output",output)
    cv2.waitKey(0)

    # 图片上写文字
    output = image.copy()
    text = cv2.putText(output,'opencv Demo',(500,500),cv2.FONT_HERSHEY_SIMPLEX,4,(255,0,0),2)
    cv2.imshow("text",output)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 图片转换颜色
    RGB_img = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    plt.imshow(RGB_img)
    plt.show()
4.9 图片偏移
图片的translating : cv2.warpAffine(img,M,(cols,rows))
img:源图片
M:translation matrix偏移矩阵,如果偏移距离是(x,y)则偏移矩阵是:
M = [[1 0 x][0 1 y]],例如偏移量是(100,50)则 M 应该是 np.float32([[1,0,100],[0,1,50]])
def test10():
    """图片偏移"""
    image = cv2.imread("add_s.jpg")
    cv2.imshow("original",image)
    cv2.waitKey(0)

    M = np.float32([[1,0,100],[0,1,50]])
    (rows, cols) = image.shape[:2]
    # print((cols,rows))

    res = cv2.warpAffine(image,M,(cols,rows))
    cv2.imshow("translation",res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
4.10 图片边缘检测
  • cv2.Canny(image, threshold1,thresold2):
    Canny算法检测图片边缘。
    threshold1:滞后过程的第一个阈值。
    
  • def test11():
        """图片边缘检测"""
        image = cv2.imread("footprint.png")
        cv2.imshow("original",image)
        cv2.waitKey(0)
    
        edges = cv2.Canny(image,100,200)
        cv2.imshow("edges", edges)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

你可能感兴趣的:(opencv,python,学习)