PIE调用Python返回得到直方图矩阵数组
程序员文章站
2023-11-14 21:34:16
前段时间我研究了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; } }
有帮助的话,记得点个赞支持一下哦~
也欢迎各位评论,指点,交流
上一篇: C#重写DataGridView