Browse Source

improve the SpecialGreyRange particle recognize function.

gsp 3 years ago
parent
commit
e850e5fda4

+ 2 - 2
OTSCPP/OTSClrInterface/ImageProClr/ImageProForClr.h

@@ -17,10 +17,10 @@ namespace OTSCLRINTERFACE
 			return ret;
 
 		}
-		  bool GetParticlesBySpecialPartGrayRange(CBSEImgClr^ bseImg, CIntRangeClr^ grayRange, CIntRangeClr^ diameterRange,double a_PixelSize, COTSFieldDataClr^ fieldData)
+		  bool GetParticlesBySpecialPartGrayRange(CBSEImgClr^ bseImg, CIntRangeClr^ grayRange, CDoubleRangeClr^ diameterRange,double a_PixelSize, COTSFieldDataClr^ fieldData)
 		  {
 
-			  bool ret = COTSImageProcess::GetParticlesBySpecialGrayRange(bseImg->GetBSEImgPtr(), grayRange->GetCIntRangePtr(),diameterRange->GetCIntRangePtr(), a_PixelSize,fieldData->GetOTSFieldDataPtr());
+			  bool ret = COTSImageProcess::GetParticlesBySpecialGrayRange(bseImg->GetBSEImgPtr(), grayRange->GetCIntRangePtr(),diameterRange->GetCDoubleRangePtr(), a_PixelSize,fieldData->GetOTSFieldDataPtr());
 			  return ret;
 
 		  }

+ 2 - 2
OTSCPP/OTSData/DoubleRange.cpp

@@ -96,14 +96,14 @@ namespace OTSDATA
 	void CDoubleRange::SetStart(double a_dStart)
 	{
 		m_dStart = a_dStart;
-		Normalise();
+		//Normalise();
 	}
 
 	// end
 	void CDoubleRange::SetEnd(double a_dEnd)
 	{
 		m_dEnd = a_dEnd;
-		Normalise();
+		//Normalise();
 	}
 
 	void CDoubleRange::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)

+ 2 - 2
OTSCPP/OTSData/IntRange.cpp

@@ -100,14 +100,14 @@ namespace OTSDATA
 	void CIntRange::SetStart(long a_nStart)
 	{
 		m_nStart = a_nStart;
-		Normalise();
+		//Normalise();
 	}
 
 	// end
 	void CIntRange::SetEnd(long a_nEnd)
 	{
 		m_nEnd = a_nEnd;
-		Normalise();
+		//Normalise();
 	}
 
 	void CIntRange::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)

+ 17 - 11
OTSCPP/OTSImagePro/OTSImageProcess.cpp

@@ -1431,7 +1431,7 @@ namespace OTSIMGPROC
 
 		return TRUE;
 	}
-	BOOL COTSImageProcess::GetParticlesBySpecialGrayRange(CBSEImgPtr a_pBSEImg, CIntRangePtr a_grayRange,CIntRangePtr a_diameterRange,double a_pixelSize, COTSFieldDataPtr m_pFieldData)
+	BOOL COTSImageProcess::GetParticlesBySpecialGrayRange(CBSEImgPtr a_pBSEImg, CIntRangePtr a_grayRange,CDoubleRangePtr a_diameterRange,double a_pixelSize, COTSFieldDataPtr m_pFieldData)
 	{
 		ASSERT(m_pFieldData);
 
@@ -1510,8 +1510,8 @@ namespace OTSIMGPROC
 				if (actualArea >= areaStart && actualArea < areaEnd)
 				{
 					Rect rectMax = Rect(x, y, w, h);
-				
-				
+
+
 
 					Mat  rectROI = labels(rectMax).clone();
 					Mat imageROI = Mat::zeros(rectMax.size(), cvcopyImg.type());
@@ -1528,16 +1528,19 @@ namespace OTSIMGPROC
 							{
 								imageROI.at<uchar>(row, col) = 255;
 							}
-							
+
 
 						}
 
 					}
-					
+
 					COTSParticleList roiParts;
-					GetOneParticleFromROI(rectMax.x, rectMax.y, rectMax.width, rectMax.height, imageROI.data, roiParts);
-					
-					 if (roiParts.size() > 0)
+					if (!GetOneParticleFromROI(rectMax.x, rectMax.y, rectMax.width, rectMax.height, imageROI.data, roiParts))
+					{
+						continue;
+					}
+
+					if (roiParts.size() > 0)
 					{
 						COTSParticlePtr roiPart = roiParts[0];
 						roiPart->SetXRayPos(CPoint(center_x, center_y));
@@ -1548,6 +1551,7 @@ namespace OTSIMGPROC
 						listParticleOut.push_back(roiPart);
 
 					}
+				     
 					
 					
 				}
@@ -1731,9 +1735,11 @@ namespace OTSIMGPROC
 			}
 		
 
-			Mat cvcopyImg = Mat(nHeightImg, nWidthImg, CV_8UC1, pPixel);// use the medianblur method to achieve the same effect as open morphology(errod and dialate).
-			medianBlur(cvcopyImg, cvcopyImg, 3);
-			pPixel = cvcopyImg.data;
+			//Mat cvcopyImg = Mat(nHeightImg, nWidthImg, CV_8UC1, pPixel);// use the medianblur method to achieve the same effect as open morphology(errod and dialate).
+			//pPixel = cvcopyImg.data;
+			COTSImageProcess::BErode3(pPixel, pTempImg, 3, nHeightImg, nWidthImg);
+			COTSImageProcess::BDilate3(pTempImg, pPixel, 3, nHeightImg, nWidthImg);
+			
 		a_pBinImgOut->SetImageData(pPixel, nWidthImg, nHeightImg);
 
 		foundedPixelNum = nNumParticle;

+ 1 - 1
OTSCPP/OTSImagePro/OTSImageProcess.h

@@ -65,7 +65,7 @@ namespace OTSIMGPROC {
 
 		static BOOL RemoveBGByFindContour(CBSEImgPtr m_pBSEImg, COTSImageProcessParamPtr a_pImageProcessParam, COTSFieldDataPtr m_pFieldData);
 		static BOOL RemoveBGByCVconnectivities(CBSEImgPtr m_pBSEImg, COTSImageProcessParamPtr a_pImageProcessParam, double a_pixelSize, COTSFieldDataPtr m_pFieldData);
-		static BOOL GetParticlesBySpecialGrayRange(CBSEImgPtr m_pBSEImg, CIntRangePtr a_grayRange, CIntRangePtr a_diameterRange, double a_pixelSize, COTSFieldDataPtr m_pFieldData);
+		static BOOL GetParticlesBySpecialGrayRange(CBSEImgPtr m_pBSEImg, CIntRangePtr a_grayRange, CDoubleRangePtr a_diameterRange, double a_pixelSize, COTSFieldDataPtr m_pFieldData);
 
 		static CIntRangePtr CalBackground(CBSEImgPtr m_pBSEImg);
 		static void GetSpecialGrayRangeImage(CBSEImgPtr a_pImgIn, CIntRangePtr a_SpecialGrayRange, CBSEImgPtr a_pBinImgOut, long& foundedPixelNum);

+ 4 - 6
OTSIncAMeasureApp/0-OTSModel/Measure/1-OTSInclution/SmplMeasureInclution.cs

@@ -320,22 +320,20 @@ namespace OTSModelSharp
             COTSImageProcParam pImgProcessParam = pMsrParam.GetImageProcessParam();
             var specialPartsparam = pMsrParam.GetSpecialGrayRangeParam();
             var pixelsize = m_Sample.CalculatePixelSize();
-            if (specialPartsparam.IsToRun)
+            if (specialPartsparam.GetIsToRun())
             {
-                List<CSpecialGrayRange> ranges = pMsrParam.GetSpecialGrayRangeParam().GetIntRanges();
+                List<CSpecialGrayRange> ranges = pMsrParam.GetSpecialGrayRangeParam().GetSpecialGreyRanges();
                 foreach (var grayRange in ranges)
                 {
                     CIntRangeClr range = new CIntRangeClr(grayRange.range.GetStart(), grayRange.range.GetEnd());
-                    CIntRangeClr diaRange = new CIntRangeClr(grayRange.diameterRange.GetStart(), grayRange.diameterRange.GetEnd());
+                    CDoubleRangeClr diaRange = new CDoubleRangeClr(grayRange.diameterRange.GetStart(), grayRange.diameterRange.GetEnd());
                     curFldData.GetPartsBySpecialGray(range, diaRange,pixelsize,grayRange.ifCollectXray);
                 }
             }
 
             // remove BES image background
             curFldData.RemoveImgBGAndGetParticles(pImgProcessParam, pixelsize);
-            
-        
-
+           
 
             // check if this is an empty image
             if (curFldData.NoParticle())

+ 1 - 1
OTSIncAMeasureApp/0-OTSModel/Measure/BSEPicData/COTSFieldData.cs

@@ -132,7 +132,7 @@ namespace OTSModelSharp
            
             return ;
         }
-        public void GetPartsBySpecialGray(CIntRangeClr grayRange, CIntRangeClr diameterRange,double pixelSize, bool ifXray)
+        public void GetPartsBySpecialGray(CIntRangeClr grayRange, CDoubleRangeClr diameterRange,double pixelSize, bool ifXray)
         {
             CImageHandler imghandler = new CImageHandler();
             List<COTSParticleClr> specialParts = new List<COTSParticleClr>();

+ 27 - 4
OTSIncAMeasureApp/0-OTSModel/Measure/ParamData/CSpecialGrayRangeParam.cs

@@ -55,20 +55,42 @@ namespace OTSMeasureApp._0_OTSModel.Measure.ParamData
     {
         const string STRSPECIALGRAYCONFIGFILE = "SpecialGrayConfig.xml";
         private List<CSpecialGrayRange> Ranges=new List<CSpecialGrayRange>();
-        private bool isToRun;
+        private bool isToRun=false;
+        private bool isInited=false;
        public static string GetParamFileFullName()
         {
             String path = ".\\" + DataPublic.STR_COFIGPATH + "\\" + DataPublic.STR_SYSTEM_DATA + "\\" + STRSPECIALGRAYCONFIGFILE;
             return path;
         }
-        public bool IsToRun { get => isToRun; set => isToRun = value; }
 
-        public List<CSpecialGrayRange> GetIntRanges()
+        public bool GetIsToRun()
         {
+            if (isInited == false)
+            {
+                LoadParam();
+                isInited = true;
+            }
+            return isToRun;
+        }
+
+        public void SetIsToRun(bool value)
+        {
+            isToRun = value;
+        }
+
+        public bool IsInited { get => isInited; set => isInited = value; }
+
+        public List<CSpecialGrayRange> GetSpecialGreyRanges()
+        {
+            if (isInited == false)
+            {
+                LoadParam();
+                isInited = true;
+            }
             return Ranges;
         }
 
-        public void SetIntRanges(List<CSpecialGrayRange> value)
+        public void SetSpecailGrayRanges(List<CSpecialGrayRange> value)
         {
             Ranges = value;
         }
@@ -124,6 +146,7 @@ namespace OTSMeasureApp._0_OTSModel.Measure.ParamData
                 doc.Load(path);
                 XmlNode root = doc.SelectSingleNode("XMLData");
                 Serialize(false, doc, root);
+                isInited = true;
                 return true;
             }
 

+ 6 - 3
OTSIncAMeasureApp/0-OTSModel/OTSDataType/COTSImageProcParam.cs

@@ -1,4 +1,5 @@
-using System;
+using OTSMeasureApp._0_OTSModel.Measure.ParamData;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -21,9 +22,10 @@ namespace OTSDataType
         private CIntRange m_oParticleGray = new CIntRange();
         private OTS_BGREMOVE_TYPE m_BGRemoveType;
         private OTS_AUTOBGREMOVE_TYPE m_autoBGRemoveType;
-      
 
-     
+        private CSpecialGrayRangeParam m_specialGreyRangeParam;
+
+        public CSpecialGrayRangeParam SpecialGreyRangeParam { get => m_specialGreyRangeParam; set => m_specialGreyRangeParam = value; }
 
         public COTSImageProcParam()
         {
@@ -36,6 +38,7 @@ namespace OTSDataType
         }
         public void Init()
         {
+            m_specialGreyRangeParam = new CSpecialGrayRangeParam();
             m_oIncArea = new CDoubleRange(DEFUALT_PARTICALE_AREA_MIN, DEFUALT_PARTICALE_AREA_MAX);
             m_oBGGray = new CIntRange(DEFUALT_BG_GRAY_LEVEL_MIN, DEFUALT_BG_GRAY_LEVEL_MAX);
             m_oParticleGray = new CIntRange(DEFUALT_PARTICLE_GRAY_LEVEL_MIN, DEFUALT_PARTICLE_GRAY_LEVEL_MAX);

+ 3 - 2
OTSIncAMeasureApp/0-OTSModel/OTSDataType/CSampleParam.cs

@@ -24,13 +24,14 @@ namespace OTSDataType
 
         public CSpecialGrayRangeParam GetSpecialGrayRangeParam()
         {
-          
+           
             return m_specialGrayRangeParam;
         }
 
         public void SetSpecialGrayRangeParam(CSpecialGrayRangeParam value)
         {
             m_specialGrayRangeParam = value;
+            m_poImageProcessParam.SpecialGreyRangeParam = value;
         }
 
         public CSampleParam()
@@ -139,7 +140,7 @@ namespace OTSDataType
 
         }
         public COTSImgScanPrm GetImageScanParam() { return m_poImageScanParam; }
-        public COTSImageProcParam GetImageProcessParam() { return m_poImageProcessParam; }
+        public COTSImageProcParam GetImageProcessParam() { m_poImageProcessParam.SpecialGreyRangeParam = m_specialGrayRangeParam; return m_poImageProcessParam; }
         public COTSXRayParam GetXRayParam() { return m_poXRayParam; }
     }
 }

+ 1 - 1
OTSIncAMeasureApp/2-OTSMeasureParamManage/COTSMeasureParam.cs

@@ -137,7 +137,7 @@ namespace OTSMeasureApp
             {
                 return false;
             }
-
+            
             return true;
         }
 

+ 1 - 0
OTSIncAMeasureApp/5-OTSMeasureStatuImageFun/OTSBSEImageFun.cs

@@ -22,6 +22,7 @@ namespace OTSMeasureApp
         }
         public bool GetBSEImage(COTSImageProcParam ImgProcPrm,double pixelSize, byte[] BSEImage, int iHeight, int iWidth, ref byte[] BSEImageNoBG)
         {
+            
            return imageHandle.GetBSEImage(ImgProcPrm,pixelSize, BSEImage, iHeight, iWidth,ref BSEImageNoBG);
         }
         public bool GetBSEImage(byte[] BSEImage, int iHeight, int iWidth, int grayStart, int grayEnd, ref byte[] BSEImageNoBG)

+ 3 - 1
OTSIncAMeasureApp/5-OTSMeasureStatuImageFun/OTSMeasureStatusWindow.cs

@@ -453,7 +453,9 @@ namespace OTSMeasureApp
                 //获取图像数据
                 COTSSample WSample = m_MeasureAppForm.m_ProjData.GetWorkingSample();
                 double pixelSize = WSample.CalculatePixelSize();
-                bfResult = m_ImageData.GetRemoveBGImage(WSample.GetMsrParams().GetImageProcessParam(),pixelSize,m_iWidth, m_iHeight, bBseData, ref cBseData);
+              
+                var imageProcessParam = WSample.GetMsrParams().GetImageProcessParam();
+                bfResult = m_ImageData.GetRemoveBGImage(imageProcessParam,pixelSize,m_iWidth, m_iHeight, bBseData, ref cBseData);
              
            
                 //取图不成功就返回

+ 4 - 2
OTSIncAMeasureApp/OTSIncAMeasureAppForm.cs

@@ -141,6 +141,7 @@ namespace OTSMeasureApp
 
             m_MsrThreadWrapper = new CMeasureThreadWrapper(this);//must be the last sentence of this procedure.
             fileWatcher.Changed += FileWatcher_Changed;
+          
             fileWatcher.EnableRaisingEvents=true;
         }
 
@@ -148,10 +149,10 @@ namespace OTSMeasureApp
         {
             if (e.Name == "SpecialGrayConfig.xml")
             {
-                m_ProjParam.m_specialRanges.LoadParam();
+                m_ProjParam.m_specialRanges.IsInited = false;
                 foreach (var s in this.m_ProjData.GetSampleList())
                 {
-                    s.GetMsrParams().GetSpecialGrayRangeParam().LoadParam();
+                    s.GetMsrParams().GetSpecialGrayRangeParam().IsInited = false;
                 }
             }
         }
@@ -170,6 +171,7 @@ namespace OTSMeasureApp
                 if (m_ProjParam.LoadParamFile() && m_ProjParam.LoadStageParamFile())
                 {
                     m_ProjParam.LoadSpecialGrayRangeParamFile();
+                  
                     if (m_ProjParam.InitResultData())
                     {
                         m_RibbonFun.SetAllRibbonButnStatus(true);

+ 62 - 2
OTSIncAMeasureApp/ServiceCenter/CImageHandler.cs

@@ -82,6 +82,26 @@ namespace OTSModelSharp.ServiceInterface
             OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();
             int num=0;
             imgpro.GetSpecialGrayRangeImage(pBSEImageIn, cIntRangeClr, pBSEImageOut,ref num);
+            for (int i = 0; i < iWidth; i++)
+            {
+                for (int j = 0; j < iHeight; j++)
+                {
+                    var bse = pBSEImageOut.GetBSEValue(i, j);
+                    if (bse == 255)
+                    {
+                        var originalBse = pBSEImageIn.GetBSEValue(i, j);
+                        pBSEImageOut.SetBSEValue(i, j, originalBse);
+                    }
+                    else 
+                    {
+                        pBSEImageOut.SetBSEValue(i, j, 255);
+                    }
+                  
+                
+                }
+            
+            }
+            
 
             BSEImageNoBG = pBSEImageOut.GetImageDataPtr();
 
@@ -93,8 +113,31 @@ namespace OTSModelSharp.ServiceInterface
        
 
             List<COTSParticleClr> parts = new List<COTSParticleClr>();
+            List<COTSParticleClr> specialGreyparts = new List<COTSParticleClr>();
             RemoveBGAndGetParts(a_pImgIn, a_pImgProcessParam, a_pixelSize,ref parts);
 
+            if (a_pImgProcessParam.SpecialGreyRangeParam.GetIsToRun())
+            {
+                var param = a_pImgProcessParam.SpecialGreyRangeParam;
+                var ranges = param.GetSpecialGreyRanges();
+              
+                
+                foreach (var r in ranges)
+                {
+                    CIntRangeClr r1 = new CIntRangeClr();
+                    r1.SetStart(r.range.GetStart());
+                    r1.SetEnd(r.range.GetEnd());
+
+                    CDoubleRangeClr r2 = new CDoubleRangeClr();
+                    r2.SetStart(r.diameterRange.GetStart());
+                    r2.SetEnd(r.diameterRange.GetEnd());
+
+                    GetParticlesBySpecialGray(a_pImgIn, r1, r2, a_pixelSize, ref specialGreyparts);
+                }
+              
+            }
+
+
             for (int i = 0; i < a_pImgOut.GetWidth(); i++)
             {
                 for (int j = 0; j < a_pImgOut.GetHeight(); j++)
@@ -102,7 +145,24 @@ namespace OTSModelSharp.ServiceInterface
                     a_pImgOut.SetBSEValue(i, j, 255);
                 }
             }
-    
+            if (specialGreyparts.Count > 0)
+            {
+                foreach (var p in specialGreyparts)
+                {
+                    foreach (var s in p.GetFeature().GetSegmentsList())
+                    {
+                        for (int i = s.GetStart(); i < s.GetStart() + s.GetLength(); i++)
+                        {
+                            var bseValue = a_pImgIn.GetBSEValue(i, s.GetHeight());
+                            a_pImgOut.SetBSEValue(i, s.GetHeight(), bseValue);
+                        }
+                    }
+
+                }
+
+            }
+
+
             foreach (var p in parts)
             {
                 foreach (var s in p.GetFeature().GetSegmentsList())
@@ -153,7 +213,7 @@ namespace OTSModelSharp.ServiceInterface
             return true;
 
         }
-        public bool GetParticlesBySpecialGray(CBSEImgClr img, CIntRangeClr grayrange, CIntRangeClr diameterRange,double a_pixelSize, ref List<COTSParticleClr> parts)
+        public bool GetParticlesBySpecialGray(CBSEImgClr img, CIntRangeClr grayrange, CDoubleRangeClr diameterRange,double a_pixelSize, ref List<COTSParticleClr> parts)
         {
             OTSCLRINTERFACE.ImageProForClr imgpro = new OTSCLRINTERFACE.ImageProForClr();