C#景深融合
最近因为一个项目要求,将matlab写的一些关于图像的算法转成C#。这个挺坑爹的,C#处理图像还是挺少的,opencv关于这方面的资源挺少的。我用的是opencvsharp这个第三方库,GitHub上有资源。
这个景深融合其实是一个显微镜扫描成像的问题,一共有数张图像,都是局部清晰,其它部分模糊。比如下面这样:
实际处理思路是:图像边缘检测,然后做了一个平滑处理,根据灰度图的亮度进行筛选,形成一个分区。最后根据分区处理像素的填充。
下面贴代码:
读取图片的操作就略去了,边缘提取用的是sobel,注意一下,opencvsharp中的图像处理注意mat数据的溢出。及时调整mat的像素深度比如16s,通常原始图像读取是8u。像素深度关系到具体坐标的数据格式。
class Oper
{
public static Mat Deal(Mat ImIn)
{
Mat mat_gray = new Mat();
//
//Mat smooth_img = new Mat();
//Cv2.GaussianBlur(ImIn, smooth_img, new OpenCvSharp.Size(3, 3), 0.96, 0.96, BorderTypes.Default);
//灰度图
Cv2.CvtColor(ImIn, mat_gray, ColorConversionCodes.BGR2GRAY);
//GetMatData.Arr(mat_gray);
Mat X = new Mat(); Mat Y = new Mat();
//InputArray arr = InputArray.Create<float>(new float[3, 3] { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } });
//Cv2.Filter2D(mat_gray,X , -1, arr, new Point(-1, -1), 0);
//InputArray arr_convert = InputArray.Create<float>(new float[3, 3] { { -1, 0, -1 }, { -2, 0, 2 }, { -1, 0, 1 } });
//Cv2.Filter2D(mat_gray, Y, -1, arr, new Point(-1, -1), 0);
//sobel边缘
//-----------这里开始转变为16位运算-------------
Cv2.Sobel(mat_gray, X, MatType.CV_16S, 1, 0, 3,1,0,BorderTypes.Replicate);
Cv2.Sobel(mat_gray, Y, MatType.CV_16S, 0, 1, 3,1,0,BorderTypes.Replicate);
//GetMatData.getData(X);
//GetMatData.getData(Y);
int width = X