OpenCV| 小程序记录-利用threshold处理显微图像

0 阅读2分钟

前言

学习计算机视觉的主要目的就是为了使用视觉方法处理我在微观实验中遇见的识别问题,在学习threshold的过程中我想到了我是否可以直接利用threshold过滤掉显微镜下的背景和我想要观察的沉淀。

代码

我直接把我的想法告诉了ai

比如这两张微流控的照片,你帮我直接用这个原理写一个小程序,我的要求如下,1.判断碳酸钙沉淀(图中黑色区域的颜色)还有其他区域,两者之间的颜色肯定有明显的区别,然后通过这个颜色区别帮我生成一张,最后其他区域都变成黑色,碳酸钙沉淀变成黑色的二值图,你能做到吗

然后ai给我生成了可以直接使用的代码

import os
import glob
import cv2 as cv
import numpy as np
​
# ========= 用户参数 =========
input_dir = "input_images"      # 放微流控原图的文件夹
output_dir = "output_binary"    # 输出二值图的文件夹
​
os.makedirs(output_dir, exist_ok=True)
​
# 支持的图片后缀,可以按需加上 .png/.jpg
img_patterns = ["*.tif", "*.png", "*.jpg", "*.jpeg"]
​
# ========= 主循环:批量处理所有图像 =========
for pattern in img_patterns:
    for img_path in glob.glob(os.path.join(input_dir, pattern)):
        img = cv.imread(img_path)
​
        if img is None:
            print(f"[WARN] 读图失败: {img_path}")
            continue
​
        # 1. BGR -> GRAY (颜色空间转换)
        gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
​
        # 2. 轻微平滑,去掉小噪声(可选,但推荐)
        #   这里用 5x5 的高斯滤波
        blur = cv.GaussianBlur(gray, (5, 5), 0)
​
        # 3. Otsu 自动阈值 + 反转
        #   THRESH_BINARY_INV 是因为:CaCO3 在原图里是黑的(像素值小)
        #   反转之后:CaCO3 -> 白色(255),背景 -> 黑色(0)
        _, binary = cv.threshold(
            blur, 0, 255,
            cv.THRESH_BINARY_INV + cv.THRESH_OTSU
        )
​
        # 4. 做一点形态学开运算,去掉小孤立噪点(可选)
        kernel = np.ones((3, 3), np.uint8)
        binary_clean = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=1)
​
        # 5. 保存结果
        base_name = os.path.splitext(os.path.basename(img_path))[0]
        out_path = os.path.join(output_dir, base_name + "_CaCO3_binary.png")
        cv.imwrite(out_path, binary_clean)
​
        print(f"[OK] 已保存: {out_path}")
​

结果

MICP-5-24.tif

MICP-5-24_CaCO3_binary.png 最终输出的结果其实有些不尽人意因为是在显微镜下面的图像,所以仅仅只用普通的颜色过滤会让一部分的阴影也被识别成了沉淀,但是总的来说我对于后续的学习更加充满了动力,因为让我感受到了图像处理的强大。在做完这个小脚本之后我也进一步学习了自适应阈值、Otsu阈值,虽然没有进一步尝试,但是关于阈值处理的数学方法也让我感到了震撼,人类的智慧真的很大!