华为AI认证_图像处理实验(图像预处理)

实验一:灰度变化

代码:

import cv2
import numpy as np

def liner_trans(org,k,b=0):
"""
    灰度变化
    :param img:
    :param k: k>1&#x65F6; &#x5B9E;&#x73B0;&#x7070;&#x5EA6;&#x6570;&#x503C;&#x7684;&#x62C9;&#x4F38;&#xFF0C;0<k<1 时 实现灰度数值的压缩, k="-1" b="255" 实现灰度数值的反转 :param b:灰度值 :return: """ # 计算灰度的线性变化映射表 translist="[(np.float32(x)*k+b)" for x in range(256)] print("映射表",translist) 需要转化为np.array transtable="np.array(translist)" 将查出[0,255]的灰度值进行调整,并指定数据类型为uint8 transtable[transtable> 255] = 255
    transTable[transTable < 0] = 0

    transTable = np.round(transTable).astype(np.uint8)
    # &#x4F7F;&#x7528;openCV&#x7684;look up table &#x4FEE;&#x6539;&#x56FE;&#x7247;&#x7684;&#x7070;&#x5EA6;&#x503C;
    return cv2.LUT(org,transTable)

if __name__ == '__main__':
    im=cv2.imread('data/mok.png')
    cv2.imshow('org',im)

    # &#x53CD;&#x8F6C;
    # img=liner_trans(im,-1,255)
    # cv2.imshow("invsion",img)

    # &#x7070;&#x5EA6;&#x62C9;&#x4F38;
    # img = liner_trans(im, 1.2)
    # cv2.imshow("graystretch", img)

    # &#x7070;&#x5EA6;&#x538B;&#x7F29;
    img = liner_trans(im, 0.8)
    cv2.imshow("graycompress", img)

    cv2.waitKey()
    cv2.destroyAllWindows()</k<1>

运行:

1.1 灰度反转

反转
img=liner_trans(im,-1,255)
cv2.imshow("invsion",img)

华为AI认证_图像处理实验(图像预处理)

1.2 灰度拉伸

灰度拉伸
img = liner_trans(im, 1.2)
cv2.imshow("graystretch", img)

华为AI认证_图像处理实验(图像预处理)

1.3 灰度压缩

灰度压缩
img = liner_trans(im, 0.8)
cv2.imshow("graycompress", img)

华为AI认证_图像处理实验(图像预处理)

1.4 gamma矫正

代码:

def gamma_tarns(img,gamma):
"""
    &#x4F3D;&#x9A6C;&#x77EB;&#x6B63;
    :param img:
    :param gamma: &#x4F3D;&#x9A6C;&#x503C;
    :return:
"""
    #&#x5148;&#x5F52;&#x4E00;&#x5316;&#x5230;1 &#x505A;&#x4F3D;&#x9A6C;&#x8BA1;&#x7B97; &#x518D;&#x8FD8;&#x539F;&#x5230;[0,255]
    gammaList=[np.power(x/255.0,gamma)*255.0 for x in range(256)]

    #&#x5C06;&#x6570;&#x636E;&#x8F6C;&#x6362;&#x4E3A;np.array &#x5E76;&#x4E14;&#x6307;&#x5B9A;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x4E3A;uint8
    gammaTable=np.round(np.array(gammaList).astype(np.uint8))

    print(gammaTable)
    # &#x4F7F;&#x7528;openCV &#x7684;look up table&#x51FD;&#x6570;&#x4FEE;&#x6539;&#x56FE;&#x50CF;&#x7684;&#x7070;&#x5EA6;&#x503C;
    return cv2.LUT(img,gammaTable)

1.4.1 使用伽马值为 0.5的变化 实现对暗部的压缩 亮部的拉伸

华为AI认证_图像处理实验(图像预处理)

1.4.2 使用伽马值为 2的变化 实现对亮部的压缩 暗部的拉伸

华为AI认证_图像处理实验(图像预处理)

实验二:直方图

2.1 直方图的显示

代码:

import cv2
import matplotlib.pyplot as plt
#&#x8BFB;&#x53D6;&#x5E76;&#x663E;&#x793A;&#x56FE;&#x50CF;

im=cv2.imread('data/1.png',0)
cv2.imshow("org",im)

#&#x7ED8;&#x5236;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x7684;&#x76F4;&#x65B9;&#x56FE;
plt.hist(im.ravel(),256,[0,256])
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

运行:

华为AI认证_图像处理实验(图像预处理)华为AI认证_图像处理实验(图像预处理)

原图灰度图 灰度图直方图

2.2 直方图均衡化

代码:

import cv2
import matplotlib.pyplot as plt
#&#x8BFB;&#x53D6;&#x5E76;&#x663E;&#x793A;&#x56FE;&#x50CF;

im=cv2.imread('data/1.png',0)
cv2.imshow("org",im)

#&#x7ED8;&#x5236;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x7684;&#x76F4;&#x65B9;&#x56FE;
plt.hist(im.ravel(),256,[0,256])
plt.show()

&#x8C03;&#x7528;OpenCV&#x7684;&#x76F4;&#x65B9;&#x56FE;&#x5747;&#x8861;&#x5316;API
im_equl=cv2.equalizeHist(im)
cv2.imshow('equal',im_equl)

&#x663E;&#x793A;&#x539F;&#x56FE;&#x50CF;&#x7684;&#x76F4;&#x65B9;&#x56FE;
plt.subplot(2,1,1)
plt.hist(im.ravel(),256,[0,256],label="org")
plt.legend()

&#x663E;&#x793A;&#x5747;&#x8861;&#x5316;&#x56FE;&#x50CF;&#x7684;&#x76F4;&#x65B9;&#x56FE;
plt.subplot(2,1,2)
plt.hist(im_equl.ravel(),256,[0,256],label="equalize")
plt.legend()

plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

运行:

华为AI认证_图像处理实验(图像预处理)华为AI认证_图像处理实验(图像预处理)

原图灰度图 原图像的直方图

华为AI认证_图像处理实验(图像预处理)

2.3 彩色直方图

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

def imageHist(img,type):
    '''
    &#x5F69;&#x8272;&#x76F4;&#x65B9;&#x56FE;
    :param img:  &#x901A;&#x9053;&#x6570;&#x636E;
    :param type:  &#x7528;&#x4E8E;&#x5224;&#x65AD;&#x4F20;&#x5165;&#x7684;&#x662F;&#x90A3;&#x4E2A;&#x901A;&#x9053;
    :return:
    '''

    # &#x5224;&#x65AD;&#x4F20;&#x9012;&#x8FDB;&#x6765;&#x7684;&#x662F;&#x90A3;&#x4E2A;&#x901A;&#x9053;
    if type == 31:  #  &#x4F20;&#x5165;&#x84DD;&#x8272;&#x901A;&#x9053;
        color = (255,0,0)
        winName = 'B Hist'
    elif type == 32:  # &#x7EFF;&#x8272;&#x901A;&#x9053;
        color = (0, 255, 0)
        winName = 'G Hist'
    else:
        color = (0, 0, 255)
        winName = 'R Hist'

    # &#x8BA1;&#x7B97;&#x548C;&#x7ED8;&#x5236;&#x76F4;&#x65B9;&#x56FE;
    hist = cv2.calcHist([img],[0],None,[256],(0.0,255.0))  # &#x8BA1;&#x7B97;&#x76F4;&#x65B9;&#x56FE;
    minV,maxV,minL,maxL = cv2.minMaxLoc(hist)  # &#x83B7;&#x53D6;&#x6700;&#x5927;&#x503C;&#x548C;&#x6700;&#x5C0F;&#x503C;&#xFF0C;&#x5E76;&#x4E14;&#x83B7;&#x53D6;&#x5BF9;&#x5E94;&#x7684;&#x4E0B;&#x6807;
    print(minV,maxV,minL,maxL)
    histImage = np.zeros([256,256,3],np.uint8)  # &#x65B0;&#x5EFA;&#x56FE;&#x50CF;&#x7684;&#x6A21;&#x677F;&#xFF0C;&#x7528;&#x4E8E;&#x76F4;&#x65B9;&#x56FE;&#x7684;&#x7ED8;&#x5236;

    for h in range(256):
        intenormal = int(hist[h] * 256 / maxV)  # &#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8D85;&#x51FA;&#x53D6;&#x503C;&#x8303;&#x56F4;
        cv2.line(histImage,(h,256),(h,256-intenormal),color)
    cv2.imshow(winName,histImage)

if __name__ == '__main__':
    im = cv2.imread('data/1.png', 1)
    cv2.imshow('im',im)

    channels = cv2.split(im)  # &#x5206;&#x5272;&#x901A;&#x9053;
    # print(channels)
    for i in range(3):
        print(channels[i])
        imageHist(channels[i],i+31)

    cv2.waitKey()
    cv2.destroyAllWindows()

考点:分割通道 channels = cv2.split(im) # 分割通道

运行:

华为AI认证_图像处理实验(图像预处理)

比较 :均值滤波 高斯滤波 中值滤波

3.1 均值滤波

代码:

import cv2
import numpy as np

def avg(img,size):
"""
    &#x5747;&#x503C;&#x6EE4;&#x6CE2;
    :param img: &#x5F85;&#x5904;&#x7406;&#x7684;&#x56FE;&#x50CF;
    :param size: &#x6EE4;&#x6CE2;&#x5668;&#x5C3A;&#x5BF8;
    :return:
"""

    avgImg=cv2.blur(img,size)
    cv2.imshow("avgImg",avgImg)

def gaussian(img,size):
"""
    &#x9AD8;&#x65AF;&#x6EE4;&#x6CE2;
    :param img: &#x5F85;&#x5904;&#x7406;&#x7684;&#x56FE;&#x50CF;
    :param size: &#x6EE4;&#x6CE2;&#x5668;&#x5C3A;&#x5BF8;
    :return:
"""
    gaussianImg=cv2.GaussianBlur(img,size,0)
    cv2.imshow("gaussianImg", gaussianImg)

def media(img,size):
"""
    &#x4E2D;&#x503C;&#x6EE4;&#x6CE2;
    :param img: &#x5F85;&#x5904;&#x7406;&#x7684;&#x56FE;&#x50CF;
    :param size: &#x6EE4;&#x6CE2;&#x5668;&#x5C3A;&#x5BF8;
    :return:
"""
    mediaImg=cv2.medianBlur(img,size)
    cv2.imshow("mediaImg", mediaImg)

def sharpen(img):
"""
    &#x56FE;&#x50CF;&#x9510;&#x5316;
    :param img:
    :return:
"""
    #&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x9510;&#x5316;&#x7B97;&#x5B50;
    M=np.array([
        [0,-1,0],
        [-1,9,-1],
        [-1,-1,-1]
    ])/4.0

    #&#x8FDB;&#x884C;&#x6EE4;&#x6CE2;&#x5904;&#x7406;
    im_s=cv2.filter2D(img,-1,M)
    cv2.imshow('im_s',im_s)

if __name__ == '__main__':
    # im=cv2.imread('data/6.png',1)
    # cv2.imshow('im',im)
    # &#x5747;&#x503C;&#x6EE4;&#x6CE2;
    # avg(im,(5,5))

    #&#x9AD8;&#x65AF;&#x6EE4;&#x6CE2;
    # gaussian(im,(5,5))

    # &#x4E2D;&#x503C;&#x6EE4;&#x6CE2;
    # media(im,5)

    #&#x56FE;&#x50CF;&#x9510;&#x5316;
    im=cv2.imread('data/09.png',1)
    cv2.imshow('im',im)
    sharpen(im)

    cv2.waitKey()
    cv2.destroyAllWindows()

均值滤波:

均值滤波
avg(im,(5,5))

华为AI认证_图像处理实验(图像预处理)

高斯滤波:

#高斯滤波
gaussian(im,(5,5))

华为AI认证_图像处理实验(图像预处理)

中值滤波:

中值滤波
media(im,5)

华为AI认证_图像处理实验(图像预处理)

图像锐化:

#图像锐化
im=cv2.imread('data/09.png',1)
cv2.imshow('im',im)
sharpen(im)

华为AI认证_图像处理实验(图像预处理)

实验四: 图像二值化

4.1 简单二值化:

代码

import cv2

def simple(img):
    '''
    &#x7B80;&#x5355;&#x4E8C;&#x503C;&#x5316;
    :param img:
    :return:
    '''
    '''
        cv2.threshold()  &#x4E8C;&#x503C;&#x5316;
        &#x53C2;&#x6570;&#xFF1A;
            &#x7B2C;&#x4E00;&#x4E2A; &#x5F85;&#x5904;&#x7406;&#x7684;&#x56FE;&#x50CF;
            &#x7B2C;&#x4E8C;&#x4E2A; &#x9608;&#x503C;
            &#x7B2C;&#x4E09;&#x4E2A; &#x989C;&#x8272;&#x503C;
            &#x7B2C;&#x56DB;&#x4E2A; &#x4E8C;&#x503C;&#x5316;&#x7684;&#x7C7B;&#x578B;
                THRESH_BINARY  &#x9ED1;&#x767D;&#x4E8C;&#x503C;
                THRESH_BINARY_INV  &#x9ED1;&#x767D;&#x7684;&#x53CD;&#x8F6C;
                THRESH_TRUNC   &#x5F97;&#x5230;&#x7684;&#x56FE;&#x50CF;&#x591A;&#x4E3A;&#x50CF;&#x7D20;&#x503C;
                THRESH_TOZERO  &#x9AD8;&#x4E8E;&#x9608;&#x503C;&#x65F6;&#x8BBE;&#x7F6E;255  &#x4F4E;&#x4E8E;&#x9608;&#x503C;&#x4E0D;&#x505A;&#x5904;&#x7406;
                THRESH_TOZERO_INV  &#x4F4E;&#x4E8E;&#x9608;&#x503C;&#x65F6;&#x8BBE;&#x7F6E;255 &#x9AD8;&#x4E8E;&#x9608;&#x503C;&#x4E0D;&#x505A;&#x5904;&#x7406;
        &#x8FD4;&#x56DE;&#x503C;
            &#x7B2C;&#x4E00;&#x4E2A;&#x662F;&#x9608;&#x503C;
            &#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x56FE;&#x50CF;
    '''
    ret,thread1 = cv2.threshold(img,172,255,cv2.THRESH_BINARY)
    ret,thread2 = cv2.threshold(img,172,255,cv2.THRESH_BINARY_INV)
    ret,thread3 = cv2.threshold(img,172,255,cv2.THRESH_TRUNC)
    ret,thread4 = cv2.threshold(img,172,0,cv2.THRESH_TOZERO)
    ret,thread5 = cv2.threshold(img,172,255,cv2.THRESH_TOZERO_INV)

    cv2.imshow("thread1",thread1)
    cv2.imshow("thread2",thread2)
    cv2.imshow("thread3",thread3)
    cv2.imshow("thread4",thread4)
    cv2.imshow("thread5",thread5)

运行:

if __name__ == '__main__':
    im = cv2.imread('data/lena.jpg', 0)
    cv2.imshow('im',im)

    simple(im)
    # auto(im)

    cv2.waitKey()
    cv2.destroyAllWindows()

华为AI认证_图像处理实验(图像预处理)

华为AI认证_图像处理实验(图像预处理)

华为AI认证_图像处理实验(图像预处理)

4.2 自适应阈值

代码


def auto(img):
    ret,thread1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

    '''
        adaptiveThreshold()  &#x81EA;&#x9002;&#x5E94;&#x9608;&#x503C;
        &#x53C2;&#x6570;&#xFF1A;
            &#x7B2C;&#x4E00;&#x4E2A;  &#x5F85;&#x5904;&#x7406;&#x7684;&#x56FE;&#x50CF;
            &#x7B2C;&#x4E8C;&#x4E2A;  &#x50CF;&#x7D20;&#x503C;&#x7684;&#x4E0A;&#x9650;
            &#x7B2C;&#x4E09;&#x4E2A;  &#x81EA;&#x9002;&#x5E94;&#x7684;&#x65B9;&#x5F0F;
                ADAPTIVE_THRESH_MEAN_C   &#x9886;&#x57DF;&#x5185;&#x7684;&#x5747;&#x503C;
                ADAPTIVE_THRESH_GAUSSIAN_C  &#x9886;&#x57DF;&#x5185;&#x50CF;&#x7D20;&#x70B9;&#x7684;&#x52A0;&#x6743;&#xFF0C;&#x6743;&#x91CD;&#x4E3A;&#x4E00;&#x4E2A;&#x9AD8;&#x65AF;&#x7A97;&#x53E3;
            &#x7B2C;&#x56DB;&#x4E2A;  &#x8D4B;&#x503C;&#x7684;&#x65B9;&#x6CD5;
            &#x7B2C;&#x4E94;&#x4E2A;  &#x8BBE;&#x5B9A;&#x9886;&#x57DF;&#x7684;&#x5927;&#x5C0F;&#xFF08;&#x4E00;&#x4E2A;&#x6B63;&#x65B9;&#x5F62;&#x9886;&#x57DF;&#xFF09;
            &#x7B2C;&#x516D;&#x4E2A;  &#x9608;&#x503C;&#x7B49;&#x4E8E;&#x5747;&#x503C;&#x6216;&#x8005;&#x52A0;&#x6743;&#x503C;&#x51CF;&#x53BB;&#x8FD9;&#x4E2A;&#x5E38;&#x6570;
    '''
    thread2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,2)
    thread3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)

    cv2.imshow('thread1',thread1)
    cv2.imshow('thread2',thread2)
    cv2.imshow('thread3',thread3)

运行:

if __name__ == '__main__':
    im = cv2.imread('data/lena.jpg', 0)
    cv2.imshow('im',im)

    # simple(im)
    auto(im)

    cv2.waitKey()
    cv2.destroyAllWindows()

华为AI认证_图像处理实验(图像预处理)

华为AI认证_图像处理实验(图像预处理)

实验五: 形态学运算

5.1 腐蚀

代码:

import cv2
import numpy as np

def corrode():
"""
    &#x8150;&#x8680;
    :return:
"""
    # &#x8BFB;&#x53D6;&#x56FE;&#x50CF;&#x5E76;&#x8FDB;&#x884C;&#x4E8C;&#x503C;&#x5316;&#x5904;&#x7406;
    im=cv2.imread('data/7.png',cv2.IMREAD_UNCHANGED)
    cv2.imshow('im',im)

    # &#x8BBE;&#x7F6E;&#x5377;&#x79EF;&#x6838;  &#x751F;&#x6210;&#x4E00;&#x4E2A;5*5 &#x5168;&#x90E8;&#x4E3A;1 &#x7684;&#x77E9;&#x9635;
    kernrl=np.ones((5,5),np.uint8)
    # &#x56FE;&#x50CF;&#x7684;&#x8150;&#x8680;
    erosion=cv2.erode(im,kernrl)
    cv2.imshow('erosion',erosion)

    cv2.waitKey()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    corrode()

运行:

华为AI认证_图像处理实验(图像预处理)

5.2 膨胀

代码:


def expand():
"""
       &#x81A8;&#x80C0;
       :return:
"""
    # &#x8BFB;&#x53D6;&#x56FE;&#x50CF;&#x5E76;&#x8FDB;&#x884C;&#x4E8C;&#x503C;&#x5316;&#x5904;&#x7406;
    im = cv2.imread('data/7.png', cv2.IMREAD_UNCHANGED)
    cv2.imshow('im', im)

    # &#x8BBE;&#x7F6E;&#x5377;&#x79EF;&#x6838;  &#x751F;&#x6210;&#x4E00;&#x4E2A;5*5 &#x5168;&#x90E8;&#x4E3A;1 &#x7684;&#x77E9;&#x9635;
    kernrl = np.ones((5, 5), np.uint8)
    # &#x56FE;&#x50CF;&#x7684;&#x81A8;&#x80C0;
    dest = cv2.dilate(im,kernrl)
    cv2.imshow('dest', dest)

    cv2.waitKey()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    # corrode()
    expand()

运行

华为AI认证_图像处理实验(图像预处理)

5.3 闭/开运算

代码:

def closepration():
"""
    &#x95ED;&#x8FD0;&#x7B97;
    :return:
"""
    # &#x8BFB;&#x53D6;&#x56FE;&#x50CF;&#x5E76;&#x8FDB;&#x884C;&#x4E8C;&#x503C;&#x5316;&#x5904;&#x7406;
    im = cv2.imread('data/7.png', cv2.IMREAD_UNCHANGED)
    cv2.imshow('im', im)
    '''
    getStructuringElement() &#x7528;&#x4E8E;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x5927;&#x5C0F;&#x548C;&#x76F8;&#x649E;&#x7684;&#x7ED3;&#x6784;&#x5143;&#x7D20;&#xFF0C;&#x7528;&#x4E8E;&#x5F62;&#x6001;&#x5B66;&#x5904;&#x7406;
        &#x53C2;&#x6570;1&#xFF1A;
        MORPH_RECT &#x77E9;&#x5F62;
        MORPH_CROSS &#x4EA4;&#x53C9;&#x578B;
        MORPH_ELLIPSE &#x692D;&#x5706;&#x578B;
    '''
    kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5 ))
    dest=cv2.morphologyEx(im,cv2.MORPH_CROSS,kernel)      #morphologyEx &#x8BE5;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5BF9;&#x56FE;&#x50CF;&#x8FDB;&#x884C;&#x4E00;&#x7CFB;&#x5217;&#x5F62;&#x6001;&#x5B66;&#x8FD0;&#x7B97;  cv2.MORPH_CROSS &#x95ED;&#x8FD0;&#x7B97;
    # dest = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel) #  cv2.MORPH_OPEN &#x5F00;&#x8FD0;&#x7B97;
    cv2.imshow("dest",dest)

    cv2.waitKey()
    cv2.destroyAllWindows()

运行;闭运算

华为AI认证_图像处理实验(图像预处理)

Original: https://blog.csdn.net/weixin_41672684/article/details/124600100
Author: 熙仪繁华
Title: 华为AI认证_图像处理实验(图像预处理)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641126/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球