CImageHandler.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. using OTSDataType;
  2. using OTSModelSharp.ImageProcess;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using static OTSDataType.otsdataconst;
  10. namespace OTSModelSharp.ServiceInterface
  11. {
  12. using OTSCLRINTERFACE;
  13. using OTSIMGPROC;
  14. using System.Windows;
  15. public class CImageHandler:IImageProcess
  16. {
  17. //获取测量的BSE图
  18. //COTSSample WSample: 工作样品测量
  19. //Byte[] BSEImage: 带背景图数据
  20. //int iHeight: 图像高度
  21. //int iWidth: 图像宽度
  22. //Byte[]BSEImageNoBG : 去背景图数据
  23. public bool GetBSEImage(COTSImageProcParam ImgProcPrm, double pixelSize, byte[] BSEImage, int iHeight, int iWidth, ref byte[] BSEImageNoBG)
  24. {
  25. Rectangle rect = new Rectangle();
  26. rect.Height = iHeight;
  27. rect.Width = iWidth;
  28. CBSEImgClr pBSEImageIn = new CBSEImgClr(rect);
  29. CBSEImgClr pBSEImageOut = new CBSEImgClr(rect);
  30. //pBSEImageIn.SetImageRect(rect);
  31. pBSEImageIn.SetImageData(BSEImage,iWidth, iHeight );
  32. //pBSEImageOut.SetImageRect(rect);
  33. if (null == ImgProcPrm)
  34. {
  35. return false;
  36. }
  37. RemoveBackGround(pBSEImageIn, ImgProcPrm, pixelSize ,ref pBSEImageOut);
  38. BSEImageNoBG = pBSEImageOut.GetImageDataPtr();
  39. return true;
  40. }
  41. /// <summary>
  42. /// 获取测量的BSE图
  43. /// </summary>
  44. /// <param name="BSEImage">BSE原数据</param>
  45. /// <param name="iHeight">图像高度</param>
  46. /// <param name="iWidth">图像宽度</param>
  47. /// <param name="grayStart"></param>
  48. /// <param name="grayEnd"></param>
  49. /// <param name="BSEImageNoBG">去背景图数据</param>
  50. /// <returns></returns>
  51. public bool GetBSEImage(byte[] BSEImage, int iHeight, int iWidth, int grayStart, int grayEnd, ref byte[] BSEImageNoBG)
  52. {
  53. Rectangle rect = new Rectangle();
  54. rect.Height = iHeight;
  55. rect.Width = iWidth;
  56. CBSEImgClr pBSEImageIn = new CBSEImgClr(rect);
  57. CBSEImgClr pBSEImageOut = new CBSEImgClr(rect);
  58. //pBSEImageIn.SetImageRect(rect);
  59. pBSEImageIn.SetImageData(BSEImage, iWidth, iHeight );
  60. CIntRangeClr cIntRangeClr = new CIntRangeClr();
  61. cIntRangeClr.SetStart(grayStart);
  62. cIntRangeClr.SetEnd(grayEnd);
  63. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  64. int num=0;
  65. imgpro.GetSpecialGrayRangeImage(pBSEImageIn, cIntRangeClr, pBSEImageOut,ref num);
  66. for (int i = 0; i < iWidth; i++)
  67. {
  68. for (int j = 0; j < iHeight; j++)
  69. {
  70. var bse = pBSEImageOut.GetBSEValue(i, j);
  71. if (bse == 255)
  72. {
  73. var originalBse = pBSEImageIn.GetBSEValue(i, j);
  74. pBSEImageOut.SetBSEValue(i, j, originalBse);
  75. }
  76. else
  77. {
  78. pBSEImageOut.SetBSEValue(i, j, 255);
  79. }
  80. }
  81. }
  82. BSEImageNoBG = pBSEImageOut.GetImageDataPtr();
  83. return true;
  84. }
  85. // remove background
  86. public void RemoveBackGround(CBSEImgClr a_pImgIn, COTSImageProcParam a_pImgProcessParam, double a_pixelSize, ref CBSEImgClr a_pImgOut)
  87. {
  88. List<COTSParticleClr> parts = new List<COTSParticleClr>();
  89. List<COTSParticleClr> specialGreyparts = new List<COTSParticleClr>();
  90. if (!RemoveBGAndGetParts(a_pImgIn, a_pImgProcessParam, a_pixelSize, ref parts))
  91. {
  92. return;
  93. }
  94. if (a_pImgProcessParam.SpecialGreyRangeParam.GetIsToRun())
  95. {
  96. var param = a_pImgProcessParam.SpecialGreyRangeParam;
  97. var ranges = param.GetSpecialGreyRanges();
  98. foreach (var r in ranges)
  99. {
  100. CIntRangeClr r1 = new CIntRangeClr();
  101. r1.SetStart(r.range.GetStart());
  102. r1.SetEnd(r.range.GetEnd());
  103. CDoubleRangeClr r2 = new CDoubleRangeClr();
  104. r2.SetStart(r.diameterRange.GetStart());
  105. r2.SetEnd(r.diameterRange.GetEnd());
  106. GetParticlesBySpecialGray(a_pImgIn, r1, r2, a_pixelSize, ref specialGreyparts);
  107. }
  108. }
  109. for (int i = 0; i < a_pImgOut.GetWidth(); i++)
  110. {
  111. for (int j = 0; j < a_pImgOut.GetHeight(); j++)
  112. {
  113. a_pImgOut.SetBSEValue(i, j, 255);
  114. }
  115. }
  116. if (specialGreyparts.Count > 0)
  117. {
  118. foreach (var p in specialGreyparts)
  119. {
  120. foreach (var s in p.GetFeature().GetSegmentsList())
  121. {
  122. for (int i = s.GetStart(); i < s.GetStart() + s.GetLength(); i++)
  123. {
  124. var bseValue = a_pImgIn.GetBSEValue(i, s.GetHeight());
  125. a_pImgOut.SetBSEValue(i, s.GetHeight(), bseValue);
  126. }
  127. }
  128. }
  129. }
  130. foreach (var p in parts)
  131. {
  132. foreach (var s in p.GetFeature().GetSegmentsList())
  133. {
  134. for (int i = s.GetStart(); i < s.GetStart() + s.GetLength(); i++)
  135. {
  136. var bseValue = a_pImgIn.GetBSEValue(i, s.GetHeight());
  137. a_pImgOut.SetBSEValue(i, s.GetHeight(), bseValue);
  138. }
  139. }
  140. }
  141. return;
  142. }
  143. public void BDilate3(string source, string target, int wDegree, int rows, int columns)
  144. {
  145. throw new NotImplementedException();
  146. }
  147. public void BErode3(string source, string target, int wDegree, int rows, int columns)
  148. {
  149. throw new NotImplementedException();
  150. }
  151. public bool CalParticleImageProp( COTSParticleClr part, double a_pixelSize)
  152. {
  153. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  154. imgpro.CalcuParticleImagePropertes(part,a_pixelSize);
  155. return true;
  156. }
  157. public bool RemoveBGAndGetParts(CBSEImgClr img, COTSImageProcParam a_pImgProcessParam,double a_pixelSize,ref List<COTSParticleClr> parts)
  158. {
  159. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  160. OTSCLRINTERFACE.COTSImgProcPrmClr prm = GetImageProcPrmClr(a_pImgProcessParam);
  161. OTSCLRINTERFACE.COTSFieldDataClr flddataclr = new OTSCLRINTERFACE.COTSFieldDataClr();
  162. if (!imgpro.GetFieldDataFromImage(img, prm, a_pixelSize, flddataclr))
  163. {
  164. return false;
  165. }
  166. parts = flddataclr.GetParticleList();
  167. return true;
  168. }
  169. public bool GetParticlesBySpecialGray(CBSEImgClr img, CIntRangeClr grayrange, CDoubleRangeClr diameterRange,double a_pixelSize, ref List<COTSParticleClr> parts)
  170. {
  171. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  172. //OTSCLRINTERFACE.COTSImgProcPrmClr prm = GetImageProcPrmClr(a_pImgProcessParam);
  173. OTSCLRINTERFACE.COTSFieldDataClr flddataclr = new OTSCLRINTERFACE.COTSFieldDataClr();
  174. imgpro.GetParticlesBySpecialPartGrayRange(img, grayrange,diameterRange,a_pixelSize, flddataclr);
  175. parts = flddataclr.GetParticleList();
  176. return true;
  177. }
  178. private COTSImgProcPrmClr GetImageProcPrmClr(COTSImageProcParam a_oSource)
  179. {
  180. COTSImgProcPrmClr prmclr = new COTSImgProcPrmClr();
  181. OTSCLRINTERFACE.CDoubleRangeClr r1 = new OTSCLRINTERFACE.CDoubleRangeClr(a_oSource.GetIncAreaRange().GetStart(), a_oSource.GetIncAreaRange().GetEnd());
  182. prmclr.SetIncArea(r1);
  183. OTSCLRINTERFACE.CIntRangeClr r2= new OTSCLRINTERFACE.CIntRangeClr(a_oSource.GetBGGray().GetStart(), a_oSource.GetBGGray().GetEnd());
  184. prmclr.SetBGGray(r2);
  185. OTSCLRINTERFACE.CIntRangeClr r3= new OTSCLRINTERFACE.CIntRangeClr(a_oSource.GetParticleGray().GetStart(), a_oSource.GetParticleGray().GetEnd());
  186. prmclr.SetParticleGray(r3);
  187. prmclr.SetBGRemoveType((int)a_oSource.GetBGRemoveType());
  188. prmclr.SetAutoBGRemoveType((int)a_oSource.GetAutoBGRemoveType());
  189. prmclr.SetErrodDilateParam(a_oSource.GetErrodDilateParam());
  190. return prmclr;
  191. }
  192. public bool MergeBigBoundaryParticles(List<COTSFieldData> allFields, double pixelSize, int scanFieldSize, Size ResolutionSize, ref List<COTSParticleClr> mergedParts)
  193. {
  194. List<COTSFieldDataClr> fldclrs = new List<COTSFieldDataClr>();
  195. foreach (var f in allFields)
  196. {
  197. COTSFieldDataClr fldclr = new COTSFieldDataClr();
  198. fldclr.SetPosition(f.GetOTSPosition());
  199. fldclr.SetImageWidth(f.Width);
  200. fldclr.SetImageHeight(f.Height);
  201. var parts = f.GetListAnalysisParticles();
  202. foreach (var p in parts)
  203. {
  204. fldclr.AddParticle(p);
  205. }
  206. fldclrs.Add(fldclr);
  207. }
  208. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  209. imgpro.MergeBigBoundaryParticles(fldclrs, pixelSize, scanFieldSize, ResolutionSize, mergedParts);
  210. return true;
  211. }
  212. }
  213. }