• (十)python语法之图像处理


    1.pillow

    from PIL import Image
    
    #1 基础
    im = Image.open("test.png")
    print(im.format, im.size, im.mode) 
    # PNG (512,512) RGBA, size=(宽,高)
    im.show() 
    
    # 灰度转换
    im = im.convert("L")  
    # 对每个像素点执行函数运算
    im = im.point(lambda i: i * 1.2) 
    
    im = im.resize((128, 128)) # 缩放
    im.save("result.png")      # 保存
    
    # 生成JPEG缩略图
    im.thumbnail((128, 128))
    im.save("result.thumbnail", "JPEG")
    
    #2 裁剪
    im = Image.open("test.jpg")
    # (左上角x, 左上角y, 右下角x, 右下角y)
    box = (100, 100, 400, 400) 
    out = im.crop(box)
    out.show()
    
    #3 粘贴
    im2 = Image.open("test.png")
    im2.paste(out, box)                        
    im2.show()
    
    #4 旋转
    out = im.transpose(Image.FLIP_LEFT_RIGHT)    
    out = im.transpose(Image.FLIP_TOP_BOTTOM)
    out.show()
    
    out = im.transpose(Image.ROTATE_90)
    out = im.transpose(Image.ROTATE_180)
    out = im.transpose(Image.ROTATE_270)
    out.show()
    
    out = im.rotate(45) 
    out.show()
    
    #5 通道分离与合并
    im = Image.open("test.jpg")
    r, g, b = im.split()               
    im = Image.merge("RGB", (b, g, r)) 
    im.show()
    
    #6 效果增强
    from PIL import ImageEnhance 
    from PIL import ImageFilter  
    
    im = Image.open("test.jpg")
    
    # 对比度
    enh = ImageEnhance.Contrast(im)
    enh.enhance(1.3).show("30% more contrast")
    
    # 滤镜
    out = im.filter(ImageFilter.DETAIL)
    out.show()
    
    #7 图像阵列
    im = Image.open("test.gif")
    im.seek(1)  # 跳到下一帧
    try:
        while 1:
            im.seek(im.tell()+1)
            im.show()
    except EOFError:   
        # 在帧尾时会得到一个EOFError异常
        pass 
    
    #8 与numpy互相转换
    a = np.array(Image.open("test.jpg"))
    print(a.shape, a.dtype)
    b = [255, 255, 255] - a
    im = Image.fromarray(b.astype('uint8'))
    im.save("test2.jpg")
    

    2.opencv

    基础

    import cv2 
    
    # 图片读取与显示
    img = cv2.imread('test.jpg', 1) 
    cv2.namedWindow("test") 
    cv2.imshow('test',img) 
    cv2.waitKey(0)
    
    # 获取像素值,(高,宽)
    (b,g,r) = img[100,200]                         
    print(b,g,r)
    
    # 图片ROI
    dst = img[200:400,200:400]                     
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 图像加权融合
    dst1 = img[200:400,200:400]   
    dst2 = img[0:200,0:200]
    dst = cv2.addWeighted(dst1,0.5,dst2,0.5,0)
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 灰度转换
    grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
    cv2.imshow('test',grey) 
    cv2.waitKey(0)
    
    # 图片缩放 (宽,高)
    dst = cv2.resize(img, (100,200))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 像素遍历
    height   = img.shape[0]
    weight   = img.shape[1]
    channels = img.shape[2]
    for row in range(height):               
        for col in range(weight):           
            for c in range(channels):       
                pv = img[row, col, c] 
                img[row, col, c] = 255 - pv                             
    cv2.imshow('test',img) 
    cv2.waitKey(0)  
    
    # 图像写入
    cv2.imwrite('cv-test.jpg', img) 
    # 0-100 jpg压缩比高
    cv2.imwrite('cv-test-50.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,50]) 
    # 0-9 png压缩比低
    cv2.imwrite('cv-test.png',img,[cv2.IMWRITE_PNG_COMPRESSION,0])
    

    阈值化滤波

    import cv2
    import numpy as np
    
    img = cv2.imread('test.jpg', 0)
    
    # 阈值化
    ret,dst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    # cv2.THRESH_BINARY_INV
    # cv2.THRESH_TRUNC
    # cv2.THRESH_TOZERO
    # cv2.THRESH_TOZERO_INV
    
    # 自适应阈值化
    dst = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    # cv2.ADAPTIVE_THRESH_GAUSSIAN_C
    
    # OTSU阈值化
    ret,dst = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 自定义滤波
    kernel = np.ones((5,5),np.float32)/25
    dst = cv2.filter2D(img,-1,kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 平均滤波
    dst = cv2.blur(img,(5,5))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
                
    # 高斯均值滤波
    dst = cv2.GaussianBlur(img,(5,5),1.5)   
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 中值滤波
    dst = cv2.medianBlur(img,5)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 双边滤波
    dst = cv2.bilateralFilter(img,15,35,35) 
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    

    形态学处理

    import cv2
    
    img = cv2.imread('test.jpg', 0)
    kernel = np.ones((5,5),np.uint8)
    
    # 腐蚀
    dst = cv2.erode(img,kernel,iterations = 1)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 膨胀
    dst = cv2.dilate(img,kernel,iterations = 1)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 开运算
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 闭运算
    dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 形态学梯度
    dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 顶帽
    dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0) 
    
    # 黑帽
    dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    

    边缘轮廓

    import cv2
    import numpy as np
    
    img = cv2.imread('test.jpg', 0)
    
    # 边缘检测
    dst = cv2.GaussianBlur(img,(3,3),0)        
    dst = cv2.Canny(dst,50,50) 
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 轮廓检测
    ret, thresh = cv2.threshold(img, 127, 255, 0)
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(img, contours, -1, (0,255,0), 3)
    cv2.imshow('test',img) 
    cv2.waitKey(0)
    
    # 轮廓拟合
    cnt = contours[0]
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,0),2)
    cv2.imshow('test',img) 
    cv2.waitKey(0)
    

    绘制

    import cv2
    
    # 绘制的底板
    dst = np.zeros((500,500,3), np.uint8)
    
    # 绘制线段 begin/end/color/line/linetype
    cv2.line(dst,(100,20),(400,20),(0,255,0),20,cv2.LINE_AA)    
    
    # 绘制矩形 左上角/右下角/color/line
    cv2.rectangle(dst,(30,50),(120,200),(255,0,0),5)  
    
    # 绘制圆形 center/radius/color/line
    cv2.circle(dst,(250,100),(50),(0,255,0),2) 
    
    # 绘制椭圆 center/轴/angle/begin/end/color/line              
    cv2.ellipse(dst,(256,256),(150,100),0,0,180,(255,255,0),-1) 
    
    # 绘制折线
    points = np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32) 
    points = points.reshape((-1,1,2))                                             
    cv2.polylines(dst,[points],True,(0,255,255))                                  
    
    # 绘制文字 文字内容/坐标/字体/字体大小/color/line/linetype
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(dst,'xxxx',(100,400),font,1,(200,100,255),2,cv2.LINE_AA) 
    
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    

    直方图

    import cv2
    import numpy as np        
    
    grey = cv2.imread('test.jpg', 0)
    img = cv2.imread('test.jpg', 1)
    
    # 直方图绘制
    color = ('b','g','r')
    for i,col in enumerate(color):
        histr = cv2.calcHist([img],[i],None,[256],[0,256])
        plt.plot(histr,color = col)
        plt.xlim([0,256])
    plt.show()
    
    # 灰度直方图均衡化
    dst = cv2.equalizeHist(grey) 
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 彩色直方图均衡化
    (b,g,r) = cv2.split(img)    
    bH = cv2.equalizeHist(b)
    gH = cv2.equalizeHist(g)
    rH = cv2.equalizeHist(r)
    dst = cv2.merge((bH,gH,rH)) 
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # YUV直方图均衡化
    imgYUV = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)
    channelYUV = cv2.split(imgYUV)
    channelYUV[0] = cv2.equalizeHist(channelYUV[0])
    channels = cv2.merge(channelYUV)
    dst = cv2.cvtColor(channels,cv2.COLOR_YCrCb2BGR)
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    

    几何变换

    import cv2
    import numpy as np
    
    img = cv2.imread('test.jpg', 1)
    height = img.shape[0]
    width = img.shape[1]
    
    # 图片缩放
    matScale = np.float32([[0.5,0,0],[0,0.5,0]])
    dst = cv2.warpAffine(img,matScale,(int(width/2),int(height/2)))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 仿射变换
    # 左上角 左下角 右上角
    matSrc = np.float32([[0,0],[0,height-1],[width-1,0]]) 
    matDst = np.float32([[50,50],[300,height-200],[width-300,100]])
    matAffine = cv2.getAffineTransform(matSrc,matDst)
    dst = cv2.warpAffine(img,matAffine,(width,height))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 图片旋转
    # center/angle/scale
    matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,1)
    dst = cv2.warpAffine(img,matRotate,(height,width))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 透视变换
    pts1 = np.float32([[200,200],[500,200],[200,500],[500,500]])
    pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(img,M,(300,300))
    cv2.imshow('test',dst) 
    cv2.waitKey(0)
    
    # 图片镜像
    img = cv2.imread('test.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]
    newImgInfo = (height*2,width,deep)
    dst = np.zeros(newImgInfo,np.uint8)#uint8 
    for i in range(0,height):
        for j in range(0,width):
            dst[i,j] = img[i,j]
            dst[height*2-i-1,j] = img[i,j]
    for i in range(0,width):
        dst[height,i] = (0,0,255)#BGR
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    
    # 图片移位1
    img = cv2.imread('test.jpg',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    
    matShift = np.float32([[1,0,100],[0,1,200]])      
    dst = cv2.warpAffine(img,matShift,(height,width))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    
    # 图片移位2
    dst = np.zeros(img.shape,np.uint8)
    for i in range(0,height):
        for j in range(0,width-100):
            dst[i,j+100]=img[i,j]
    cv2.imshow('image',dst)
    cv2.waitKey(0)
    
  • 相关阅读:
    android 的权限
    做android遇到有问题有感
    帮人写的 论文 C语言的 学生管理系统
    android 服务器的 mysql 查询悲剧
    android开发遇到的问题
    想和各位技术高人材交流技术特建了相关的QQ群
    Invalid token '44' in input string
    设置PLSQL Developer访问本机64位Oracle
    SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作……错误:3219……”的解决方法
    C#的JSON开发包 LitJSON
  • 原文地址:https://www.cnblogs.com/qxcheng/p/13536475.html
Copyright © 2020-2023  润新知