如题:主要的工作和目的是:
1.建立wpf工程,搭建简单的图像处理的界面(图像的打开、显示和保存);
2.将wpf读取到的图像文件交给由matlab制作的DLL进行处理(图像的信息读取。调用matla的dll)
3.将返回的结果进行显示等操作。
【】Matlab的相关检查与准备工作:
1. 打开Matlab,并在命令行中输入:mbuild -setup
一、 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, []);
以上代码的功能是实现图像由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;
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);
代码的前面几行是怎样从保存图像的数据矩阵中提取R、G、B三通道信息的
三、 这样程序就可以用了:
我这里的运行结果是三张图,我们可以根据需要选择是否保存最终显示的图像:
注意:程序在运行的过程中等待的时间会比较长。
运行结果: