求bmp 图像 黑斑检测mfc 算法解决办法
求bmp 图像 黑斑检测mfc 算法


检测到黑斑的位置并标记出来 求高手指点
------解决思路----------------------
对所有像素求平均值
将图像每个像素减去平均值,再乘以一个大于1的系数(黑斑增强)
显示处理后的图像
------解决思路----------------------
《学习OpenCV(中文版)》
findContours
------解决思路----------------------
用自适应二值化行不,类似一楼的说法,完后得到模版,自然就可以标记了
------解决思路----------------------
------解决思路----------------------
这个问题很简单,方法如下:
1,图像颜色增强,如果你是在不想做,就试试直方图均衡化;
2,一般增强后的图像中会明显看到圆形斑块,此时你可以进行二值化得到圆形斑块的信息,包括位置,质心,外接矩形,都可以算出来。
------解决思路----------------------
我用直方图均衡化试了下,效果图如下:

在做个二值化,很容易得到你要的结果。
------解决思路----------------------
二值化后检测
检测到黑斑的位置并标记出来 求高手指点
------解决思路----------------------
对所有像素求平均值
将图像每个像素减去平均值,再乘以一个大于1的系数(黑斑增强)
显示处理后的图像
------解决思路----------------------
《学习OpenCV(中文版)》
findContours
------解决思路----------------------
用自适应二值化行不,类似一楼的说法,完后得到模版,自然就可以标记了
------解决思路----------------------
84.void ImageBinarization(IplImage *src)
85.{ /*对灰度图像二值化,自适应门限threshold*/
86. int i,j,width,height,step,chanel,threshold;
87. /*size是图像尺寸,svg是灰度直方图均值,va是方差*/
88. float size,avg,va,maxVa,p,a,s;
89. unsigned char *dataSrc;
90. float histogram[256];
91.
92. width = src->width;
93. height = src->height;
94. dataSrc = (unsigned char *)src->imageData;
95. step = src->widthStep/sizeof(char);
96. chanel = src->nChannels;
97. /*计算直方图并归一化histogram*/
98. for(i=0; i<256; i++)
99. histogram[i] = 0;
100. for(i=0; i<height; i++)
101. for(j=0; j<width*chanel; j++)
102. {
103. histogram[dataSrc[i*step+j]-'0'+48]++;
104. }
105. size = width * height;
106. for(i=0; i<256; i++)
107. histogram[i] /=size;
108. /*计算灰度直方图中值和方差*/
109. avg = 0;
110. for(i=0; i<256; i++)
111. avg += i*histogram[i];
112. va = 0;
113. for(i=0; i<256; i++)
114. va += fabs(i*i*histogram[i]-avg*avg);
115. /*利用加权最大方差求门限*/
116. threshold = 20;
117. maxVa = 0;
118. p = a = s = 0;
119. for(i=0; i<256; i++)
120. {
121. p += histogram[i];
122. a += i*histogram[i];
123. s = (avg*p-a)*(avg*p-a)/p/(1-p);
124. if(s > maxVa)
125. {
126. threshold = i;
127. maxVa = s;
128. }
129. }
130. /*二值化*/
131. for(i=0; i<height; i++)
132. for(j=0; j<width*chanel; j++)
133. {
134. if(dataSrc[i*step+j] > threshold)
135. dataSrc[i*step+j] = 255;
136. else
137. dataSrc[i*step+j] = 0;
138. }
139.}
------解决思路----------------------
这个问题很简单,方法如下:
1,图像颜色增强,如果你是在不想做,就试试直方图均衡化;
2,一般增强后的图像中会明显看到圆形斑块,此时你可以进行二值化得到圆形斑块的信息,包括位置,质心,外接矩形,都可以算出来。
------解决思路----------------------
我用直方图均衡化试了下,效果图如下:
在做个二值化,很容易得到你要的结果。
------解决思路----------------------
二值化后检测