openCV+ Python3.7 Simpleblobdetecter() 识别斑点

主要运用了局部对比度增强

输入图片路径即可

 


import numpy as np
import cv2

def getVarianceMean(scr, winSize):
    if scr is None or winSize is None:
        print("The input parameters of getVarianceMean Function error")
        return -1

    if winSize % 2 == 0:
        print("The window size should be singular")
        return -1

    copyBorder_map=cv2.copyMakeBorder(scr,winSize//2,winSize//2,winSize//2,winSize//2,cv2.BORDER_REPLICATE)
    shape=np.shape(scr)

    local_mean=np.zeros_like(scr)
    local_std=np.zeros_like(scr)

    for i in range(shape[0]):
        for j in range(shape[1]):
            temp=copyBorder_map[i:i+winSize,j:j+winSize]
            local_mean[i,j],local_std[i,j]=cv2.meanStdDev(temp)
            if local_std[i,j]<=0:
                local_std[i,j]=1e-8

    return local_mean,local_std

def adaptContrastEnhancement(scr, winSize, maxCg):
    if scr is None or winSize is None or maxCg is None:
        print("The input parameters of ACE Function error")
        return -1

    YUV_img=cv2.cvtColor(scr,cv2.COLOR_BGR2LAB)    ##转换通道
    Y_Channel = YUV_img[:,:,0]
    shape=np.shape(Y_Channel)

    meansGlobal=cv2.mean(Y_Channel)[0]

    ##这里提供使用boxfilter 计算局部均质和方差的方法
    #    localMean_map=cv2.boxFilter(Y_Channel,-1,(winSize,winSize),normalize=True)
    #    localVar_map=cv2.boxFilter(np.multiply(Y_Channel,Y_Channel),-1,(winSize,winSize),normalize=True)-np.multiply(localMean_map,localMean_map)
    #    greater_Zero=localVar_map>0
    #    localVar_map=localVar_map*greater_Zero+1e-8
    #    localStd_map = np.sqrt(localVar_map)

    localMean_map, localStd_map=getVarianceMean(Y_Channel,winSize)

    for i in range(shape[0]):
        for j in range(shape[1]):

            cg = 0.2*meansGlobal/ localStd_map[i,j];
            if cg >maxCg:
                cg=maxCg
            elif cg<1:
                cg=1

            temp = Y_Channel[i,j].astype(float)
            temp=max(0,min(localMean_map[i,j]+cg*(temp-localMean_map[i,j]),255))

            #            Y_Channel[i,j]=max(0,min(localMean_map[i,j]+cg*(Y_Channel[i,j]-localMean_map[i,j]),255))
            Y_Channel[i,j]=temp


    YUV_img[:,:,0]=Y_Channel

    dst=cv2.cvtColor(YUV_img,cv2.COLOR_YUV2BGR)

    return dst






def callback(object):
    pass

cv2.namedWindow('image', cv2.WINDOW_NORMAL)

img1 = cv2.imread('Test01_image48.jpg')  #这里输入文件
dstimg=adaptContrastEnhancement(img1,15,10)


# img2=cv2.cvtColor(img1,cv2.COLOR_RGB2LAB)


cv2.createTrackbar('minArea', 'image', 0, 1000, callback)
cv2.createTrackbar('maxArea', 'image', 0, 2000, callback)
cv2.createTrackbar('minCircularity', 'image', 0, 99, callback)
cv2.createTrackbar('minConvexity', 'image', 0, 99, callback)
cv2.createTrackbar('minInertiaRatio', 'image', 0, 99, callback)

params = cv2.SimpleBlobDetector_Params()


params.filterByCircularity = True  #圆度
params.filterByArea=True  #大小
params.filterByInertia = True
params.filterByConvexity = True



while True:


    minCircularity = cv2.getTrackbarPos('minCircularity', 'image')
    minConvexity = cv2.getTrackbarPos('minConvexity', 'image')
    minInertiaRatio = cv2.getTrackbarPos('minInertiaRatio', 'image')
    minArea = cv2.getTrackbarPos('minArea', 'image')
    maxArea = cv2.getTrackbarPos('maxArea', 'image')
    lower_red = np.array([150, 0, 155])

    upper_red = np.array([255, 255, 255])
    # mask=cv2.inRange(dstimg, lower_red, upper_red)
    #
    # kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    # out = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel,iterations=5)
    #
    # out=cv2.bitwise_not(out)


    params.minCircularity = (minCircularity + 1) / 100.0
    params.minConvexity = (minConvexity + 1) / 100.0
    params.minInertiaRatio = (minInertiaRatio + 1) / 100.0
    params.minArea = minArea + 1
    params.maxArea = maxArea + 1
    detector = cv2.SimpleBlobDetector_create(params)
    keypoints = detector.detect(dstimg)



    im_with_keypoints = cv2.drawKeypoints(img1, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)







    cv2.imshow('image', im_with_keypoints)

    print(len(keypoints))
    print(minArea)
    print(maxArea)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值