python opencv 获取图片清晰度

场景描述:
  当我们对相机进行聚焦调试时,需要对聚焦的效果有一个量化的值作为评判依据,辅助我们更好的完成聚焦工作。

功能描述:
  在相机视野的指定位置,显示当前画面的清晰度值。

功能实现:
  目前网上场景的清晰度计算方式有一下几种:

  1. 拉普拉斯Laplacian,利用拉普拉斯计算图片的二阶导数,反映图片的边缘信息,同样事物的图片,清晰度高的,相对应的经过拉普拉斯算子滤波后的图片的方差也就越大。
def get_picture_sharpness(image_path):
	image = cv2.imread(image_path)
	image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	
	image_var = str(int(cv2.Laplacian(image_gray, cv2.CV_64F).var()))
	# image_var = str(int(cv2.Laplacian(image_gray, cv2.CV_16U).var()))


	font_face = cv2.FONT_HERSHEY_COMPLEX
	font_scale = 1
	thickness = 1
	baseline = 0

	var_size = cv2.getTextSize(image_var, font_face, font_scale, thickness)
	# 清晰度值的绘制位置
	draw_start_point = (20, var_size[0][1] + 10)
	cv2.putText(image, image_var, draw_start_point, font_face, font_scale, (0,0,255), thickness)

	cv2.imshow('frame', image)
	cv2.waitKey(0)

	return image_var
  1. Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。
def get_picture_sharpness(image_path):
	image = cv2.imread(image_path)
	image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

	image_sobel = cv2.Sobel(image_gray, cv2.CV_16U, 1, 1)
	image_var = f'{mean(image_sobel):.2f}'


	font_face = cv2.FONT_HERSHEY_COMPLEX
	font_scale = 1
	thickness = 1
	baseline = 0

	var_size = cv2.getTextSize(image_var, font_face, font_scale, thickness)
	# 清晰度值的绘制位置
	draw_start_point = (20, var_size[0][1] + 10)
	cv2.putText(image, image_var, draw_start_point, font_face, font_scale, (0,0,255), thickness)

	cv2.imshow('frame', image)
	cv2.waitKey(0)

	return image_var

你可能感兴趣的:(opencv,opencv,python,计算机视觉)