前段时间我研究了PIE SDK与Python的结合,已经能成功的通过C#调用Python,获得彩色直方图。(上一篇随笔中有分享:https://www.cnblogs.com/yuan1120/p/11126869.html )
在上次成功的基础上,这次我打算通过C#调用Python,返回得到直方图矩阵的数组,方便用于各种特征值的计算。
结果如下图所示:
先打开一张栅格图片
开发环境:vs2013 framework4、 python 3.7
通过Python中的这三个模块 PIL、numpy、matplotlib可以得到直方图矩阵数组,Python代码如下:
1 # -*- coding: utf-8 -*- 2 import sys 3 from PIL import Image 4 from PIL import ImageDraw 5 import numpy as np 6 import matplotlib.pyplot as plt 7 8 #索引传入图片地址 9 aaa=sys.argv[1] 10 im = Image.open(aaa) 11 r,g,b=im.split() 12 13 width, height = im.size 14 rpix = r.load() 15 gpix = g.load() 16 bpix = b.load() 17 his1 = [0]*768 18 for aw in range(width): 19 for ah in range(height): 20 p_r = rpix[aw,ah] 21 p_g = gpix[aw,ah]+256 22 p_b = bpix[aw,ah]+512 23 his1[p_r] = his1[p_r]+1 24 his1[p_g] = his1[p_g]+1 25 his1[p_b] = his1[p_b]+1 26 27 a=[str(i) for i in his1] 28 b=' '.join(a) 29 #以字符串形式返回 30 print(b)
C#代码如下:
注意添加引用System.Threading.Tasks
扫描二维码关注公众号,回复:
7108562 查看本文章
1 private void 外部调用ToolStripMenuItem_Click(object sender, EventArgs e) 2 { 3 //启动一个进程 4 System.Diagnostics.Process p = new System.Diagnostics.Process(); 5 p.Exited += p_Exited; 6 7 p.StartInfo.UseShellExecute = false; 8 p.StartInfo.RedirectStandardOutput = true;//重定向输出 9 p.StartInfo.RedirectStandardError = true; 10 //启动python.exe 11 p.StartInfo.FileName = @"G:\pythonOnhere\python.exe";//自己安装python.exe的路径 12 p.StartInfo.CreateNoWindow = true; 13 14 string m_InputFile1 = m_InputFile.Replace(@"\", "/");//已经打开的栅格文件路径,由于python识别的路径格式和C#有一点区别,注意转换格式 15 p.StartInfo.Arguments = @"E:\PIE开发\7.py" + " " + m_InputFile1; //构造参数,将算法文件(.py)和算法参数一并传入,以空格间隔 16 p.EnableRaisingEvents = true; 17 p.Start(); 18 19 //注意,如果想从python中返回获取字符串,一定要加入下面三句 20 p.BeginOutputReadLine(); 21 p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 22 p.WaitForExit(); 23 }
进程退出时,启动
private void p_Exited(object sender, EventArgs e) { System.Diagnostics.Process p = sender as System.Diagnostics.Process; MessageBox.Show(histo); } //输出打印的信息 private void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { histo = e.Data + Environment.NewLine; } }
有帮助的话,记得点个赞支持一下哦~
也欢迎各位评论,指点,交流