GreyPeak.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #pragma once
  2. #include "afx.h"
  3. namespace OTSIMGPROC
  4. {
  5. enum GrayPeakType
  6. {
  7. leftBias = 1,
  8. peakInMiddle=2,
  9. rightBias=3,
  10. normalPeak=4,
  11. smallPeak=5
  12. };
  13. class MyGreyPeak
  14. {
  15. public:
  16. int start;
  17. int end;
  18. int peakPos;
  19. int peakValue;
  20. int valleyValue;
  21. int allNoneZeroGreyLevelNum;//valid grey level number
  22. int maxPeakvalue;//max peak of all the peak
  23. long area;
  24. MyGreyPeak* nextRng;
  25. MyGreyPeak* preRng;
  26. int GetSpan()
  27. {
  28. return end - start;
  29. }
  30. int GetDvalue()
  31. {
  32. return peakValue - valleyValue;
  33. }
  34. GrayPeakType GetPeakType()
  35. {
  36. GrayPeakType peakType;//1:left bias 2:peak in middle 3:right bias.4:big peak,5:small peak
  37. double leftBias = peakPos - start;
  38. double rightBias = end - peakPos;
  39. double proportion = leftBias / rightBias;
  40. double dvalue = (double)GetDvalue();
  41. double span = (double)GetSpan();
  42. double spanProportion = span / allNoneZeroGreyLevelNum;
  43. double dpeak = peakValue;
  44. double peakProportion = dpeak / maxPeakvalue;
  45. double dvalueProportion = dvalue / maxPeakvalue;
  46. if (nextRng == NULL)
  47. {
  48. peakType=GrayPeakType::normalPeak;
  49. }
  50. if (peakProportion < 0.1 && spanProportion < 0.05)
  51. {
  52. peakType = GrayPeakType::smallPeak;
  53. }
  54. if (proportion > 0.66 && rightBias <= 1)
  55. {
  56. peakType =GrayPeakType::rightBias;
  57. }
  58. else if (proportion < 0.33 && leftBias <= 1)
  59. {
  60. peakType = GrayPeakType::leftBias;
  61. }
  62. else
  63. {
  64. peakType = GrayPeakType::peakInMiddle;
  65. }
  66. if (dvalueProportion >= 0.1 && peakType == 2)
  67. {
  68. peakType=GrayPeakType::normalPeak;
  69. }
  70. if (spanProportion >= 0.1 && peakType == 2)
  71. {
  72. peakType=GrayPeakType::normalPeak;
  73. }
  74. return peakType;
  75. }
  76. void MergePeak(MyGreyPeak* curRange)//merge the invalid range into adjacent range.
  77. {
  78. area += curRange->area;
  79. if (curRange->peakValue > peakValue)
  80. {
  81. peakValue = curRange->peakValue;
  82. peakPos = curRange->peakPos;
  83. }
  84. if (curRange->valleyValue < valleyValue)
  85. {
  86. valleyValue = curRange->valleyValue;
  87. }
  88. if (curRange->end > end)//curRange is on the right of this range.
  89. {
  90. end = curRange->end;
  91. nextRng = curRange->nextRng;
  92. if (nextRng != NULL)
  93. {
  94. nextRng->preRng = this;
  95. }
  96. delete curRange;
  97. }
  98. else//curRange is on the left of this range.
  99. {
  100. start = curRange->start;
  101. preRng = curRange->preRng;
  102. if (preRng != NULL)
  103. {
  104. preRng->nextRng = curRange->nextRng;
  105. }
  106. delete curRange;
  107. }
  108. }
  109. static BOOL MergeGreyPeaks(MyGreyPeak* firstRng, MyGreyPeak*& resultFirstRng);
  110. };
  111. }