用OpenCV实现Photoshop曲线功能的'在图像中取样设置黑场'

某位朋友在实验中遇到一个任务,具体来说,就是给定一张含有细胞组织采样的显微图片,手动用photoshop去除这张图片的灰色背景,从而获得背景比较干净的图片 方便细胞计数   。原始实验图片如下:

这张图片中图片有明显的灰蒙蒙的背景噪声,我们的目的就是想把背景的灰色信息扔掉。

方法一,分别对RGB各个图层的每个像素进行操作,统一的减少背景色像素点的值,让背景色接近0. 
这种方式有2个问题:所有的像素值都减少的话,图像的对比度会降低(因为获得的图片像素值范围小于0到255);另一方面图片的整体亮度会降低;
方法三中我们会改进它,让像素值空间重新映射到0到255.

方法二,对每个图层进行阈值化。
经过这种方式处理后,非噪声点的像素值没有变化,但是因为像素值的断点导致图片颜色不再平滑,会出现非常多的噪点,结果十分不理想。
如下图,方法二抛弃。


方法三,使用Photoshop曲线功能的'在图像中取样设置黑场'。
这个功能的文字描述看起来让人摸不着头脑。实际上操作可以看成方法一减背景法的改良版。通过曲线窗口的结果我们可以看出,这个功能就是帮我们将减去背景色的像素进行了一个重新映射。
具体来说就是,点击一个像素点后,记录这个像素点的RGB值,对全图进行处理。三通道分别操作,每个低于这个点相应值的,就设成0;其他的点等比例拉伸成0~255范围。
从数学上来看,默认的曲线是 y = x, 所以曲线是一条对角线;进行了这个操作之后,我们变化了这条曲线的斜率,但依然让值域扩展到0到255。注意,进行曲线调整后&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Photoshop 插件使用 OpenCV 读取图像到 Mat ,您可以使用 Photoshop SDK 的 File 类来打开图像文件,然后使用 OpenCV 的 imread() 函数将图像读取到 Mat 。以下是一个简单的示例代码: ```c++ #include "PIHeaders.h" #include <opencv2/opencv.hpp> SPErr ReadImage(const char* filename, cv::Mat& image) { SPErr error = kSPNoError; try { // 打开文件 SPPlatformFileSpecification fileSpec; SPErr err = sSPBasic->AcquireFileList(kSPFileListChoose, NULL, &fileSpec, 1, NULL, NULL); if (err != kSPNoError) { error = err; throw std::runtime_error("Failed to open file dialog."); } PIFileHandle fileHandle; err = sPSFileProvider->PIOpenFileRead(fileSpec, &fileHandle); if (err != kSPNoError) { error = err; throw std::runtime_error("Failed to open file."); } // 将文件读取到内存 size_t fileSize = sPSFileProvider->PIGetFileSize(fileHandle); char* fileData = new char[fileSize]; size_t bytesRead = 0; err = sPSFileProvider->PIReadFile(fileHandle, fileData, fileSize, &bytesRead); if (err != kSPNoError) { error = err; throw std::runtime_error("Failed to read file."); } // 读取图像到 Mat cv::Mat tempImage = cv::imread(fileData, cv::IMREAD_COLOR); if (tempImage.empty()) { error = kSPBadParameterError; throw std::runtime_error("Failed to read image."); } image = tempImage.clone(); // 释放资源 delete[] fileData; sPSFileProvider->PICloseFile(fileHandle); } catch (const std::exception& ex) { sSPBasic->Alert((char*)ex.what()); } return error; } ``` 在此示例代码,我们首先使用 Photoshop SDK 的 sSPBasic->AcquireFileList() 函数打开文件对话框,让用户选择要打开的图像文件。然后,我们使用 sPSFileProvider->PIOpenFileRead() 函数打开文件,使用 sPSFileProvider->PIGetFileSize() 和 sPSFileProvider->PIReadFile() 函数将文件读取到内存。最后,我们使用 OpenCV 的 imread() 函数将图像读取到 Mat 。 请注意,此示例代码仅用于说明如何在 Photoshop 插件使用 OpenCV 读取图像到 Mat ,实际应用可能需要更复杂的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值