zoukankan      html  css  js  c++  java
  • WPF中调用matlab制作的dll进行图像处理

    如题:主要的工作和目的是:

      1.建立wpf工程,搭建简单的图像处理的界面(图像的打开、显示和保存);

      2.将wpf读取到的图像文件交给由matlab制作的DLL进行处理(图像的信息读取。调用matla的dll)

      3.将返回的结果进行显示等操作。

    【】Matlab的相关检查与准备工作:

      1. 打开Matlab,并在命令行中输入:mbuild -setup

        

        这样matlab就配置好了

    一、 Matlab的DLL的制作:

      1.最初的matlab函数的代码:

     1 function [gray, Cb, Cr] = RgbToYCbCr(R, G, B)
     2 %将读取到的三通道的信息,整理成浮点型
     3 R = double(R);
     4 G = double(G);
     5 B = double(B);
     6 %声明三个大小想吐的矩阵用来存储变换过的信息
     7 [r,c,d]=size(R);
     8 gray=zeros(r,c);
     9 Cr=zeros(r,c);
    10 Cb=zeros(r,c);
    11 %变换过程
    12 for i=1:r
    13 for j=1:c
    14      gray(i,j) = 0.2290 * R(i,j) + 0.5780 * G(i,j) + 0.1140 * B(i,j);   
    15      Cr(i,j) = 0.50 * R(i,j) - 0.4187 * G(i,j) - 0.0813 * B(i,j) + 128;
    16      Cb(i,j) = -0.1687 * R(i,j) - 0.3313 * G(i,j) + 0.5 * B(i,j) + 128;
    17 end
    18 end
    19 %整理
    20 gray=uint8(gray);
    21 Cb=uint8(Cb);
    22 Cr=uint8(Cr);
    23 %显示
    24 figure(1);
    25 imshow(gray, []);
    26 
    27 figure(2);
    28 imshow(Cb, []);
    29 
    30 figure(3);
    31 imshow(Cr, []);
    View Code

        以上代码的功能是实现图像由RGB色度空间大YCbCr色度空间的转换

      2.建立一个matlab的工程,将刚刚写好的函数程序包含进去:

        (1) File->new->Deployment Project:

          

        (2) 在右上角为工程添加类和已经编写好的.m文件:

          ------>

          最好是先1后2的顺序,先添加class后添加file文件

        (3) 点击build界面右边的的齿轮图表->Build选项:

          

                         --->   

          这个过程要花费大概5、6分钟的时间。

          最终生成的文件情况:

            

    二、 WPF的操作部分:

      1. 将上述生成文件其中的RGB_YCbCr.dll和RGB_YCbCrNative.dll添加到wpf工程的引用中

        并在程序的头部添加相应的引用:

    1 using MathWorks.MATLAB.NET.Arrays;
    2 using MathWorks.MATLAB.NET.Utility;
    3 using RGB_YCbCr;
    View Code

      2. 下面是对matlab的dll的调用了:

     1 //由于Pixels包含是4个通道的像素信息,应该将其拆开
     2                         double[,] r_Pixels = new double[imgHeight, imgWidth];
     3                         double[,] g_Pixels = new double[imgHeight, imgWidth];
     4                         double[,] b_Pixels = new double[imgHeight, imgWidth];
     5                         for (int i = 0; i < imgHeight; ++i)
     6                         {
     7                             for (int j = 0; j < imgWidth; ++j)
     8                             {
     9                                 //Pixels是包含图像的所有信息的矩阵变量
    10                                 r_Pixels[i, j] = Pixels[i][j].R;
    11                                 g_Pixels[i, j] = Pixels[i][j].G;
    12                                 b_Pixels[i, j] = Pixels[i][j].B;
    13                             }
    14                         }
    15 
    16                         //对由matlab编写的dll的调用
    17                         RGB_YCbCr.RGB_YCbCr dc = new RGB_YCbCr.RGB_YCbCr();
    18                         MWArray result = null;
    19                         result = dc.RgbToYCbCr((MWNumericArray)r_Pixels, (MWNumericArray)g_Pixels,
    20                             (MWNumericArray)b_Pixels);
    21                         //将处理后得到的结果转化为C#的数据矩阵
    22                         MWNumericArray temp = (MWNumericArray)result;
    23                         Array array = temp.ToArray(MWArrayComponent.Real);
    View Code

        代码的前面几行是怎样从保存图像的数据矩阵中提取R、G、B三通道信息的

    三、 这样程序就可以用了:

        我这里的运行结果是三张图,我们可以根据需要选择是否保存最终显示的图像:

        注意:程序在运行的过程中等待的时间会比较长。

        运行结果:

        

        

  • 相关阅读:
    python操作mysql封装成类
    es 数据 导出 到 MySQL
    Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)
    解决VM虚拟机中的ubuntu不能全屏的问题
    pandas操作,感觉不错,复制过来的
    BTree和B+Tree详解
    ant安装配置
    jmeter默认生成测试报告
    学习网站
    selenium多窗口切换(windows)
  • 原文地址:https://www.cnblogs.com/Joyes1989/p/3101605.html
Copyright © 2011-2022 走看看