• 缺陷检测


    # -*- coding: utf-8 -*-
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    import cv2



    #
    # *针孔 zhenkong Min<1 gate>=0.6 Min>1 gate>=0.8 12张
    # *起粒 qili 5 Min<1 Max<50 gate<=0.6 Min<1 Max>50 gate>=0.4 5张 选 0.4
    # *挂伤 guashang Max<20 0.4<gate<=0.5 20<Max<40 0.1<gate<=0.4 Max>40 gate<=0.2
    # *挂流 gualiu Min<1 Max<50 0.2<gate<=0.5 选0.4





    #C:/Users/Administrator/Desktop/漆膜数据集样本/qimoshujuji/困难的分割图片/gualiu/
    #guashang qili zhenkong



    img = cv.imread('C:/Users/Administrator/Desktop/qimoshujujiance/qimoshujuji/hard_images/00.jpg',0)
    rows, cols = img.shape
    crow,ccol = rows//2 , cols//2



    im_copy_max=np.zeros([rows,cols],dtype=float)
    def max_filte(x,y,step,image_fiter_max3):
    sum_s=[]
    for k in range(-int(step/2),int(step/2)+1):
    for m in range(-int(step/2),int(step/2)+1):
    sum_s.append(image_fiter_max3[x+k][y+m])
    sum_s.sort()

    # if(max(sum_s)>140):
    # value=1
    # else:
    # value=0
    return max(sum_s)

    #return sum_s[(int(step*step/2)+1)]
    def test(Step,image_fiter_max3):
    for i in range(int(Step/2),img.shape[0]-int(Step/2)):
    for j in range(int(Step/2),img.shape[1]-int(Step/2)):
    im_copy_max[i][j]=max_filte(i,j,Step,image_fiter_max3)
    return im_copy_max


    f = np.fft.fft2(img)
    #F(u,v)频域变换
    fshift = np.fft.fftshift(f)
    #将低频移动到图像的中心
    fshift_ima=np.abs(fshift)
    #A(u,v)=|F(u,v)|求频幅
    #magnitude_spectrum = 20*np.log(np.abs(fshift))
    magnitude_spectrum = 20*np.log(np.abs(fshift))

    row_n,col_n=magnitude_spectrum.shape
    magnitude_spectrum_max3=test(2,magnitude_spectrum)
    magnitude_spectrum_max3[0][:]=magnitude_spectrum[0][:]
    magnitude_spectrum_max3[rows-1][:]=magnitude_spectrum[rows-1][:]
    magnitude_spectrum_max3[:,0]=magnitude_spectrum[:,0]
    magnitude_spectrum_max3[:,cols-1]=magnitude_spectrum[:,cols-1]

    #拉伸小取对数L(u,v)=log(A(u,v))
    # laplacian_image=cv2.Laplacian(magnitude_spectrum_max3,cv2.CV_64F)

    #laplacian_image_max3=test(3,laplacian_image)

    #大津阈值分割法

    def OTSU_enhance(img_gray, th_begin=0, th_end=256, th_step=1):
    assert img_gray.ndim == 2, "must input a gary_img"

    max_g = 0
    suitable_th = 0
    for threshold in range(th_begin, th_end, th_step):
    bin_img = img_gray > threshold
    bin_img_inv = img_gray <= threshold
    fore_pix = np.sum(bin_img)
    back_pix = np.sum(bin_img_inv)
    if 0 == fore_pix:
    break
    if 0 == back_pix:
    continue

    w0 = float(fore_pix) / img_gray.size
    u0 = float(np.sum(img_gray * bin_img)) / fore_pix
    w1 = float(back_pix) / img_gray.size
    u1 = float(np.sum(img_gray * bin_img_inv)) / back_pix
    # intra-class variance
    g = w0 * w1 * (u0 - u1) * (u0 - u1)
    if g > max_g:
    max_g = g
    suitable_th = threshold
    return suitable_th
    th2 = OTSU_enhance(magnitude_spectrum_max3, th_begin=0, th_end=256, th_step=1)



    MASK=np.zeros([rows,cols],dtype=bool)



    def max_filte1(x,y,step):
    sum_s=[]
    for k in range(-int(step/2),int(step/2)+1):
    for m in range(-int(step/2),int(step/2)+1):
    sum_s.append(magnitude_spectrum_max3[x+k][y+m])
    sum_s.sort()

    if(max(sum_s)>th2*2):
    value=0
    else:
    value=1
    return value

    # return sum_s[(int(step*step/2)+1)]
    def test1(Step):
    for i in range(int(Step/2),img.shape[0]-int(Step/2)):
    for j in range(int(Step/2),img.shape[1]-int(Step/2)):
    MASK[i][j]=max_filte1(i,j,Step)



    test1(2)


    plt.subplot(231),plt.imshow(img, cmap = 'gray')
    plt.title('img'), plt.xticks([]), plt.yticks([])
    plt.subplot(232),plt.imshow(fshift_ima, cmap = 'gray')
    plt.title('fshift_ima'), plt.xticks([]), plt.yticks([])
    plt.subplot(233),plt.imshow(magnitude_spectrum, cmap = 'gray')
    plt.title('magnitude_spectrum'), plt.xticks([]), plt.yticks([])

    #
    plt.subplot(234),plt.imshow(magnitude_spectrum_max3, cmap = 'gray')
    plt.title('magnitude_spectrum_max3'), plt.xticks([]), plt.yticks([])


    # plt.subplot(235),plt.imshow(laplacian_image, cmap = 'gray')
    # plt.title('laplacian_image3'), plt.xticks([]), plt.yticks([])


    plt.subplot(236),plt.imshow(MASK, cmap = 'gray')
    plt.title('MASK'), plt.xticks([]), plt.yticks([])

    plt.show()





    img_bad = cv.imread('C:/Users/Administrator/Desktop/qimoshujujiance/qimoshujuji/hard_images/00.jpg',0)
    rows, cols
    img_bad = cv2.resize(img_bad,(cols,rows),interpolation=cv2.INTER_CUBIC)
    #im_copy_max=im_copy_max.reshape((rows,cols))
    #进行傅里叶变换
    f = np.fft.fft2(img_bad)
    #平移中心
    fshift1 = np.fft.fftshift(f)
    #进行收缩变换
    magnitude_spectrum1 = 20*np.log(np.abs(fshift1))

    fshift=fshift1*MASK

    #平移逆变换
    f_ishift = np.fft.ifftshift(fshift)
    #傅里叶反变换
    img_back = np.fft.ifft2(f_ishift)
    # 取绝对值


    img_back = np.abs(img_back)





    fshift_image=np.abs(fshift)



    #%求最大灰度值

    bad_Max = max(np.max(img_back,axis=0))
    #%求最小灰度值
    bad_Min =min(np.min(img_back,axis=0))

    ret,thresh1=cv2.threshold(img_back,bad_Max*0.3,255,cv2.THRESH_BINARY)

    plt.subplot(321),plt.imshow(img_bad, cmap = 'gray')
    plt.title('Input img_bad'), plt.xticks([]), plt.yticks([])

    plt.subplot(322),plt.imshow(magnitude_spectrum1, cmap = 'gray')
    plt.title('magnitude_spectrum1'), plt.xticks([]), plt.yticks([])



    plt.subplot(323),plt.imshow(np.abs(fshift), cmap = 'gray')
    plt.title('np.abs(fshift)'), plt.xticks([]), plt.yticks([])

    plt.subplot(324),plt.imshow(img_back, cmap = 'gray')
    plt.title('img_back)'), plt.xticks([]), plt.yticks([])

    plt.subplot(325),plt.imshow(thresh1, cmap = 'gray')
    plt.title('thresh1)'), plt.xticks([]), plt.yticks([])

    plt.show()








    #########################################################################小波部分
    #小波去噪
    import pywt
    #小波分解
    ##返回 (cA, (cH, cV, cD)), 分别是逼近、水平细节、垂直细节和对角线细节
    img_back_Max = max(np.max(img_back,axis=0))
    ################################################################################直接可以用的
    #hard data中绝对值小于阈值2的替换为6,大于2的不替换
    img_back_new=pywt.threshold(img_back,img_back_Max*0.5, "hard",0)
    #ret,thresh1=cv2.threshold(img_bad,180,255,cv2.THRESH_BINARY)
    plt.subplot(121),plt.imshow(img_back_new, cmap = 'gray')
    plt.show()

    #####################################################################################













    # img_back1 = cv.imread('C:/Users/Administrator/Desktop/10.png',0)
    coeffs = pywt.dwt2(img_back, "db4")
    cA, (cH, cV, cD) = coeffs
    #print (cA)

    rows1, cols1 = cA.shape



    cA_mean = np.mean(cA)
    CH_mean = np.mean(cH)
    cV_mean=np.mean(cV)
    cD_mean=np.mean(cD)



    cH_image=np.zeros([rows1,cols1],dtype=float)
    cV_image=np.zeros([rows1,cols1],dtype=float)
    cD_image=np.zeros([rows1,cols1],dtype=float)


    tw=2

    def Variance(Image,newImage,mean,var):
    rows, cols = Image.shape

    for i in range(0,rows-1):
    for j in range(0,cols-1):
    a=Image[i][j]
    abs_a=np.abs(a)
    T_value=np.sqrt(np.abs(a-mean))*tw
    # T_value=var*tw
    if(abs_a>T_value):
    if(a>0):
    newImage[i][j]=(abs_a-T_value)
    elif(a==0):
    newImage[i][j]=0
    else:
    newImage[i][j]=-(abs_a-T_value)
    else:
    newImage[i][j]=0

    return newImage
    cA

    #求方差

    cH_arr_var = np.var(cH)
    cV_arr_var = np.var(cV)
    cD_arr_var = np.var(cD)
    cH_image1=Variance(cH,cH_image,CH_mean,cH_arr_var)
    cV_image1=Variance(cV,cV_image,cV_mean,cV_arr_var)
    cD_image1=Variance(cD,cD_image,cD_mean,cD_arr_var)

    coeffs=(cA, (cH_image1, cV_image1, cD_image1))
    after_idwt_image_= pywt.idwt2(coeffs,'db4')

    ################将近似图像设置为0时重建图像
    # cA_NEW=np.zeros(cA.shape,dtype=float)
    # coeffs_new=(cA_NEW, (cH_image1, cV_image1, cD_image1))
    # after_idwt_image_new= pywt.idwt2(coeffs_new,'db4')
    # # new_images=cH_image1+cV_image1+cD_image1




    Variance
    plt.subplot(521),plt.imshow(cA, cmap = 'gray')
    plt.title('cA'), plt.xticks([]), plt.yticks([])

    plt.subplot(522),plt.imshow(cH, cmap = 'gray')
    plt.title('cH'), plt.xticks([]), plt.yticks([])

    plt.subplot(523),plt.imshow(cV, cmap = 'gray')
    plt.title('cV'), plt.xticks([]), plt.yticks([])

    plt.subplot(524),plt.imshow(cD, cmap = 'gray')
    plt.title('cD'), plt.xticks([]), plt.yticks([])

    plt.subplot(525),plt.imshow(after_idwt_image_, cmap = 'gray')
    plt.title('after_idwt_image_'), plt.xticks([]), plt.yticks([])


    plt.subplot(526),plt.imshow(cH_image1, cmap = 'gray')
    plt.title('cH_image1'), plt.xticks([]), plt.yticks([])

    plt.subplot(527),plt.imshow(cV_image1, cmap = 'gray')
    plt.title('cV_image1'), plt.xticks([]), plt.yticks([])


    plt.subplot(528),plt.imshow(cD_image1, cmap = 'gray')
    plt.title('cD_image1'), plt.xticks([]), plt.yticks([])


    # plt.subplot(529),plt.imshow(new_images, cmap = 'gray')
    # plt.title('new_images'), plt.xticks([]), plt.yticks([])

    #
    # plt.subplot(529),plt.imshow(after_idwt_image_new, cmap = 'gray')
    # plt.title('after_idwt_image_new'), plt.xticks([]), plt.yticks([])

    plt.show()

    ##############################################分割图像

    after_idwt_image_












    ####################################################接下来是分割XX图像
    #傅里叶去噪后的图像
    img_back
    #小波变换后的重建图像



    #现在进行二值化


    def mean_filte1(x,y,step,image):
    sum_s=[]
    for k in range(-int(step/2),int(step/2)+1):
    for m in range(-int(step/2),int(step/2)+1):
    sum_s.append(image[x+k][y+m])
    sum_s.sort()
    #mean=np.sum(sum_s,axis=0)/step**2

    return max(sum_s)
    def test_mean(Step,image,new_iamge):
    for i in range(int(Step/2),img.shape[0]-int(Step/2)):
    for j in range(int(Step/2),img.shape[1]-int(Step/2)):
    new_iamge[i][j]=mean_filte1(i,j,Step,image)
    return new_iamge

    after_idwt_image_new=np.zeros(after_idwt_image_.shape,dtype=float)
    new_iamge=test_mean(5,after_idwt_image_,after_idwt_image_new)

    # ret,new_iamge=cv2.threshold(new_iamge,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    # cv2.imshow('new_iamge',new_iamge)


    #%求最大灰度值

    Max = max(np.max(new_iamge,axis=0))
    #%求最小灰度值
    Min =min(np.min(new_iamge,axis=0))

    after_idwt_image_new


    ret,thresh1_image=cv2.threshold(new_iamge,Max*0.5,255,cv2.THRESH_BINARY)




    img_back
    ##########################################################
    new_after_res_mean = np.mean(after_idwt_image_new)*4

    ret2,thresh1_image2=cv2.threshold(after_idwt_image_new,new_after_res_mean,255,cv2.THRESH_BINARY)
    #########################################################################################
    plt.subplot(321),plt.imshow(after_idwt_image_, cmap = 'gray')
    plt.title('after_idwt_image_'), plt.xticks([]), plt.yticks([])

    plt.subplot(322),plt.imshow(new_iamge, cmap = 'gray')
    plt.title('new_iamge'), plt.xticks([]), plt.yticks([])

    plt.subplot(323),plt.imshow(thresh1_image, cmap = 'gray')
    plt.title('thresh1_image'), plt.xticks([]), plt.yticks([])


    plt.subplot(325),plt.imshow(img_back, cmap = 'gray')
    plt.title('img_back'), plt.xticks([]), plt.yticks([])

    plt.subplot(324),plt.imshow(thresh1_image2, cmap = 'gray')
    plt.title('thresh1_image2'), plt.xticks([]), plt.yticks([])

    plt.show()
  • 相关阅读:
    WinDbg调试C#技巧,解决CPU过高、死锁、内存爆满
    Window环境下搭建Git服务器
    Virtual Box虚拟机Ubuntu系统安装及基本配置
    修改VS2017新建类模板文件添加注释
    .net core 使用IIS作为宿主Web服务器,部署常见问题
    Asp.Net进程外Session(状态服务器Session、数据库Session)
    百度地图DEMO-路线导航,测距,标点
    c#文件图片操作
    C#代码安装Windows服务(控制台应用集成Windows服务)
    通过经纬度获取地址信息
  • 原文地址:https://www.cnblogs.com/shuimuqingyang/p/11605127.html
Copyright © 2020-2023  润新知