CImageHandler.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. RemoveBGAndGetParts(a_pImgIn, a_pImgProcessParam, a_pixelSize,ref parts);
  91. if (a_pImgProcessParam.SpecialGreyRangeParam.GetIsToRun())
  92. {
  93. var param = a_pImgProcessParam.SpecialGreyRangeParam;
  94. var ranges = param.GetSpecialGreyRanges();
  95. foreach (var r in ranges)
  96. {
  97. CIntRangeClr r1 = new CIntRangeClr();
  98. r1.SetStart(r.range.GetStart());
  99. r1.SetEnd(r.range.GetEnd());
  100. CDoubleRangeClr r2 = new CDoubleRangeClr();
  101. r2.SetStart(r.diameterRange.GetStart());
  102. r2.SetEnd(r.diameterRange.GetEnd());
  103. GetParticlesBySpecialGray(a_pImgIn, r1, r2, a_pixelSize, ref specialGreyparts);
  104. }
  105. }
  106. for (int i = 0; i < a_pImgOut.GetWidth(); i++)
  107. {
  108. for (int j = 0; j < a_pImgOut.GetHeight(); j++)
  109. {
  110. a_pImgOut.SetBSEValue(i, j, 255);
  111. }
  112. }
  113. if (specialGreyparts.Count > 0)
  114. {
  115. foreach (var p in specialGreyparts)
  116. {
  117. foreach (var s in p.GetFeature().GetSegmentsList())
  118. {
  119. for (int i = s.GetStart(); i < s.GetStart() + s.GetLength(); i++)
  120. {
  121. var bseValue = a_pImgIn.GetBSEValue(i, s.GetHeight());
  122. a_pImgOut.SetBSEValue(i, s.GetHeight(), bseValue);
  123. }
  124. }
  125. }
  126. }
  127. foreach (var p in parts)
  128. {
  129. foreach (var s in p.GetFeature().GetSegmentsList())
  130. {
  131. for (int i = s.GetStart(); i < s.GetStart() + s.GetLength(); i++)
  132. {
  133. var bseValue = a_pImgIn.GetBSEValue(i, s.GetHeight());
  134. a_pImgOut.SetBSEValue(i, s.GetHeight(), bseValue);
  135. }
  136. }
  137. }
  138. return;
  139. }
  140. public void BDilate3(string source, string target, int wDegree, int rows, int columns)
  141. {
  142. throw new NotImplementedException();
  143. }
  144. public void BErode3(string source, string target, int wDegree, int rows, int columns)
  145. {
  146. throw new NotImplementedException();
  147. }
  148. public bool CalParticleImageProp( COTSParticleClr part, double a_pixelSize)
  149. {
  150. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  151. imgpro.CalcuParticleImagePropertes(part,a_pixelSize);
  152. return true;
  153. }
  154. public bool RemoveBGAndGetParts(CBSEImgClr img, COTSImageProcParam a_pImgProcessParam,double a_pixelSize,ref List<COTSParticleClr> parts)
  155. {
  156. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  157. OTSCLRINTERFACE.COTSImgProcPrmClr prm = GetImageProcPrmClr(a_pImgProcessParam);
  158. OTSCLRINTERFACE.COTSFieldDataClr flddataclr = new OTSCLRINTERFACE.COTSFieldDataClr();
  159. imgpro.GetFieldDataFromImage(img, prm, a_pixelSize, flddataclr);
  160. parts = flddataclr.GetParticleList();
  161. return true;
  162. }
  163. public bool GetParticlesBySpecialGray(CBSEImgClr img, CIntRangeClr grayrange, CDoubleRangeClr diameterRange,double a_pixelSize, ref List<COTSParticleClr> parts)
  164. {
  165. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  166. //OTSCLRINTERFACE.COTSImgProcPrmClr prm = GetImageProcPrmClr(a_pImgProcessParam);
  167. OTSCLRINTERFACE.COTSFieldDataClr flddataclr = new OTSCLRINTERFACE.COTSFieldDataClr();
  168. imgpro.GetParticlesBySpecialPartGrayRange(img, grayrange,diameterRange,a_pixelSize, flddataclr);
  169. parts = flddataclr.GetParticleList();
  170. return true;
  171. }
  172. private COTSImgProcPrmClr GetImageProcPrmClr(COTSImageProcParam a_oSource)
  173. {
  174. COTSImgProcPrmClr prmclr = new COTSImgProcPrmClr();
  175. OTSCLRINTERFACE.CDoubleRangeClr r1 = new OTSCLRINTERFACE.CDoubleRangeClr(a_oSource.GetIncAreaRange().GetStart(), a_oSource.GetIncAreaRange().GetEnd());
  176. prmclr.SetIncArea(r1);
  177. OTSCLRINTERFACE.CIntRangeClr r2= new OTSCLRINTERFACE.CIntRangeClr(a_oSource.GetBGGray().GetStart(), a_oSource.GetBGGray().GetEnd());
  178. prmclr.SetBGGray(r2);
  179. OTSCLRINTERFACE.CIntRangeClr r3= new OTSCLRINTERFACE.CIntRangeClr(a_oSource.GetParticleGray().GetStart(), a_oSource.GetParticleGray().GetEnd());
  180. prmclr.SetParticleGray(r3);
  181. prmclr.SetBGRemoveType((int)a_oSource.GetBGRemoveType());
  182. prmclr.SetAutoBGRemoveType((int)a_oSource.GetAutoBGRemoveType());
  183. return prmclr;
  184. }
  185. public bool MergeBigBoundaryParticles(List<COTSFieldData> allFields, double pixelSize, int scanFieldSize, Size ResolutionSize, ref List<COTSParticleClr> mergedParts)
  186. {
  187. List<COTSFieldDataClr> fldclrs = new List<COTSFieldDataClr>();
  188. foreach (var f in allFields)
  189. {
  190. COTSFieldDataClr fldclr = new COTSFieldDataClr();
  191. fldclr.SetPosition(f.GetOTSPosition());
  192. fldclr.SetImageWidth(f.Width);
  193. fldclr.SetImageHeight(f.Height);
  194. var parts = f.GetListAnalysisParticles();
  195. foreach (var p in parts)
  196. {
  197. fldclr.AddParticle(p);
  198. }
  199. fldclrs.Add(fldclr);
  200. }
  201. OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
  202. imgpro.MergeBigBoundaryParticles(fldclrs, pixelSize, scanFieldSize, ResolutionSize, mergedParts);
  203. return true;
  204. }
  205. }
  206. }