用于手动调焦显微镜的景深叠加代码,用于自动调焦的可以联系我。
# -*- coding: utf-8 -*-
# cython: language_level=3
#帮我写个py,
import copy
import os
import time
import cv2
import numpy as np
# from PIL import Image
结果图 = None
清晰度图 = None
def 清晰度提取(img):
a = 5 # 叠加区块大小,必须奇数
img32 = img.astype(np.float32)
img32 = cv2.GaussianBlur(img32,(a, a), 0) #高斯模糊
imgl = cv2.Laplacian(img32, -1) #拉普拉斯
imgl = imgl/(img32+np.mean(img32))
imgl = np.abs(imgl)
if len(img.shape) == 3:
if img.shape[2] == 3:
dimg = imgl[:,:,0]+imgl[:,:,1]+imgl[:,:,2]
else:
print('23颜色异常',img.shape)
else:
dimg = imgl
return dimg
def 实时景深叠加(img,图像宽=0,图像高=0,高度 = 0,启动=0): ## 启动=0表实时,启动=1表示结束,启动=2表示启动
global 结果图,清晰度图
画布宽, 画布高 = 600, 400
if 启动 == 1:
print('32结果图尺寸',结果图.shape)
return 结果图
if 启动 == 2:
清晰度图 = 清晰度提取(img)
结果图 = copy.deepcopy(img)
显示清晰度 = 清晰度图*(255/np.max(清晰度图))
显示清晰度 = 显示清晰度.astype(np.uint8)
cv2.namedWindow('image2', cv2.WINDOW_KEEPRATIO) # 禁止改变窗口大小
cv2.resizeWindow('image2', 画布宽*2, 画布高) # 尺寸
cv2.moveWindow('image2', 0, 0) # 坐标
显示图 = cv2.resize(img, (画布宽, 画布高), interpolation=cv2.INTER_LINEAR) # INTER_LINEAR 双线性插值
显示图 = np.uint8(显示图)
显示清晰度 = cv2.resize(显示清晰度, (画布宽, 画布高), interpolation=cv2.INTER_LINEAR) # INTER_LINEAR 双线性插值
显示清晰度 = np.uint8(显示清晰度)
显示清晰度 = np.stack((显示清晰度,) * 3, axis=-1) # 这里简单地将单通道值复制到所有三个通道
# 使用np.hstack,因为它沿着水平轴(即第二个轴)拼接数组
宽显示图 = np.hstack((显示图, 显示清晰度))
cv2.imshow('image2', 宽显示图)
k = cv2.waitKey(1) & 0xFF
if 启动 == 0:
print('45继续叠加',结果图.shape,清晰度图.shape)
宽, 高 = img.shape[1], img.shape[0]
img1 = 清晰度提取(img)
结果图[:, :, 0] = np.where(清晰度图 > img1, 结果图[:, :, 0], img[:, :, 0]) # 彩色合并图像
结果图[:, :, 1] = np.where(清晰度图 > img1, 结果图[:, :, 1], img[:, :, 1]) # 彩色合并图像
结果图[:, :, 2] = np.where(清晰度图 > img1, 结果图[:, :, 2], img[:, :, 2]) # 彩色合并图像
清晰度图 = np.where(清晰度图 > img1, 清晰度图, img1) # 黑白合并图像
显示清晰度 = 清晰度图*(255/np.max(清晰度图))
显示清晰度 = 显示清晰度.astype(np.uint8)
显示图 = cv2.resize(img, (画布宽, 画布高), interpolation=cv2.INTER_LINEAR) # INTER_LINEAR 双线性插值
显示图 = np.uint8(显示图)
显示清晰度 = cv2.resize(显示清晰度, (画布宽, 画布高), interpolation=cv2.INTER_LINEAR) # INTER_LINEAR 双线性插值
显示清晰度 = np.uint8(显示清晰度)
显示清晰度 = np.stack((显示清晰度,) * 3, axis=-1) # 这里简单地将单通道值复制到所有三个通道
# 使用np.hstack,因为它沿着水平轴(即第二个轴)拼接数组
宽显示图 = np.hstack((显示图, 显示清晰度))
cv2.imshow('image2', 宽显示图)
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.imwrite('1.bmp', 结果图) #保存图片
# cv2.imshow('image2', 宽显示图)
# k = cv2.waitKey(1) & 0xFF
#实时景深叠加 # 启动=0表实时,启动=1表示结束,启动=2表示启动
# 主函数
def 主函数():
import cv2
# 打开默认摄像头
cap = cv2.VideoCapture(1)
ret, 图像 = cap.read()
print('92图像', 图像.shape)
实时景深叠加(图像, 启动=2) # (img,图像宽=0,图像高=0,高度 = 0,启动=0): ## 启动=0表实时,启动=1表示结束,启动=2表示启动
while True:
# 从摄像头读取一帧
ret, 图像 = cap.read()
# 检查是否成功读取
if not ret:
break
# print('105图像',图像.shape)
实时景深叠加(图像, 启动=0) # 启动=2表示启动
# cv2.imshow('Camera Feed', 图像)
# # 按下 'q' 键退出循环
# if cv2.waitKey(1) & 0xFF == ord('q'):
# break
# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
# 图片路径 = r'C:\Users\hou\Desktop\景深叠加\合成\b' # 使用原始字符串
主函数()