主要运用了局部对比度增强
输入图片路径即可
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()