前段時間我研究了PIE SDK與Python的結合,已經能成功的通過C#調用Python,獲得彩色直方圖。(上一篇隨筆中有分享:https://www.cnblogs.com/yuan1120/p/11126869.html ) 在上次成功的基礎上,這次我打算通過C#調用Python,返回得到直方圖 ...
前段時間我研究了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
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; } }
有幫助的話,記得點個贊支持一下哦~
也歡迎各位評論,指點,交流