1.单色图像的分割算法,基于处理灰度值的两类特性:不连续性和相似性。
基于第一类特性,假设这些区域的边界彼此完全不同,且与背景不同,从而允许基于灰度的局部不连续性来进行边界检测。
第二类基于区域的分割方法是根据事先定义的一组准则把一幅图像分割成相似的几个区域。
2.例子:
一幅在恒定灰度的暗背景上叠加一个恒定灰度区域的图像,基于灰度的局部不连续性来进行边界检测。
#include"opencv.hpp"
using namespace cv;
#ifdef _DEBUG
#pragma comment(lib,"opencv_core2413d.lib")
#pragma comment(lib,"opencv_imgproc2413d.lib")
#pragma comment(lib,"opencv_highgui2413d.lib")
#pragma comment(lib,"opencv_features2d2413d.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#else
#pragma comment(lib,"opencv_core2413.lib")
#pragma comment(lib,"opencv_imgproc2413.lib")
#pragma comment(lib,"opencv_highgui2413.lib")
#pragma comment(lib,"opencv_features2d2413.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#endif
int main(){
//Mat src = imread("Fig1001(a)(constant_gray_region).tif", 0);
Mat src = imread("Fig1001(d)(noisy_region).tif", 0);
Mat dst,dev,mask;
if (src.channels() != 1){
cvtColor(src, src,CV_BGR2HLS);
}
threshold(src, dst, 200, 255, THRESH_BINARY);
imshow("dst", dst);
waitKey();
return 0;
}
Mat src = imread("Fig1001(a)(constant_gray_region).tif", 0);
Mat dst;
threshold(src, dst, 200, 255, THRESH_BINARY);
其中threshold参数:
得到分割的结果如下:
基于区域,区分纹理区域和恒定区域的一个属性。像素值的标准差是完成该任务的一种度量,因为在纹理区域标准差非零,而在其他区域标准差为零。
下图显示了将原图分成大小为4*4的一系列子区域后的结果,若某个子区域像素的标准差为正,将该子区域标记为白色,其他为零。
#include"opencv.hpp"
using namespace cv;
#define N 4
#ifdef _DEBUG
#pragma comment(lib,"opencv_core2413d.lib")
#pragma comment(lib,"opencv_imgproc2413d.lib")
#pragma comment(lib,"opencv_highgui2413d.lib")
#pragma comment(lib,"opencv_features2d2413d.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#else
#pragma comment(lib,"opencv_core2413.lib")
#pragma comment(lib,"opencv_imgproc2413.lib")
#pragma comment(lib,"opencv_highgui2413.lib")
#pragma comment(lib,"opencv_features2d2413.lib")
#pragma comment(lib,"opencv_calib3d2413.lib")
#endif
int main(){
//Mat src = imread("Fig1001(a)(constant_gray_region).tif", 0);
Mat src = imread("Fig1001(d)(noisy_region).tif", 0);
Mat dst,dev,mask;
if (src.channels() != 1){
cvtColor(src, src,CV_BGR2HLS);
}
float sum = 0,mean=0;
for (int i = 0; i < src.rows-N; i+=N){
for (int j = 0; j < src.cols-N; j+=N){
sum = 0;
for (int m = 0; m < N; m++){
for (int n = 0; n < N; n++){
sum += src.at<uchar>(i + m, j + n);
}
}
mean = sum / 16;
sum = 0;
for (int m = 0; m < N; m++){
for (int n = 0; n < N; n++){
sum += (src.at<uchar>(i + m, j + n) - mean)*(src.at<uchar>(i + m, j + n) - mean);
}
}
if (sqrt(sum)>10){
for (int m = 0; m < N; m++){
for (int n = 0; n < N; n++){
src.at<uchar>(i + m, j + n) =255;
}
}
}
else{
for (int m = 0; m < N; m++){
for (int n = 0; n < N; n++){
src.at<uchar>(i + m, j + n) = 0;
}
}
}
}
}
//meanStdDev(src, dst, dev, mask);
//threshold(src, dst, 200, 255, THRESH_BINARY);
imshow("dst", src);
waitKey();
return 0;
}