显微镜景深叠加代码python

用于手动调焦显微镜的景深叠加代码,用于自动调焦的可以联系我。
# -*- 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'  # 使用原始字符串
    主函数()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值