第5章:
#include "cv.h"
#include "highgui.h"
void onthreshold(IplImage* src, IplImage* dst); //单一阈值化
void onadptivethreshold(IplImage* src, IplImage* dst); //自适应阈值化
int main(int agrc, char** agrv)
{
IplImage* src_image = cvLoadImage("1.png");
IplImage* dst_image = cvCloneImage(src_image);
IplImage* temp = cvCloneImage(src_image);
IplImage* pyr_temp = cvCreateImage(cvSize(src_image->width/2, src_image->height/2), src_image->depth, 3);
cvNamedWindow("src_image", 1);
cvShowImage("src_image", src_image);
cvPyrDown(src_image, pyr_temp, CV_GAUSSIAN_5x5); //降采样操作
cvNamedWindow("pyrdown_image", 1);
cvShowImage("pyrdown_image", pyr_temp);
cvErode(src_image, dst_image, NULL, 1); //腐蚀
cvNamedWindow("erode_image", 1);
cvShowImage("erode_image", dst_image);
cvDilate(src_image, dst_image, NULL, 1); //膨胀
cvNamedWindow("dilate_image", 1);
cvShowImage("dilate_image", dst_image);
cvMorphologyEx(src_image, dst_image, temp, NULL, CV_MOP_GRADIENT, 1); //形态学梯试操作
cvNamedWindow("morphology_image", 1);
cvShowImage("morphology_image", dst_image);
cvMorphologyEx(src_image, dst_image, temp, NULL, CV_MOP_BLACKHAT, 1); //形态学黑帽
cvNamedWindow("tophat_image", 1);
cvShowImage("tophat_image", dst_image);
IplImage* temp_dst = cvCreateImage(cvGetSize(src_image), IPL_DEPTH_8U, 1);
IplImage* gray_image = cvCreateImage(cvGetSize(src_image), IPL_DEPTH_8U, 1);
cvCvtColor(src_image, gray_image, CV_RGB2GRAY);
cvNamedWindow("gray_image", 1);
cvShowImage("gray_image", gray_image);
onthreshold(src_image, temp_dst); //单一阈值化
cvNamedWindow("threshold1_image", 1);
cvShowImage("threshold1_image", temp_dst);
cvThreshold(gray_image, temp_dst, 100, 255, CV_THRESH_BINARY);
cvNamedWindow("threshold2_image", 1);
cvShowImage("threshold2_image", temp_dst);
cvAdaptiveThreshold(gray_image, temp_dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5); //自适应阈值化
cvNamedWindow("adaptivethreshold_image", 1);
cvShowImage("adaptivethreshold_image", temp_dst);
cvReleaseImage(&src_image);
cvReleaseImage(&dst_image);
cvReleaseImage(&temp_dst);
cvReleaseImage(&temp);
cvReleaseImage(&gray_image);
cvReleaseImage(&pyr_temp);
int c = cvWaitKey(0);
if (c ==27)
{
return -1;
}
return 0;
}
//单一阈值化
//
void onthreshold(IplImage* src, IplImage* dst)
{
IplImage* image_r = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage* image_g = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage* image_b = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
cvSplit(src, image_r, image_g, image_b, NULL);
IplImage* temp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
cvAddWeighted(image_r, 1./3., image_g, 1./3., 0.0, temp);
cvAddWeighted(temp, 2./3., image_b, 1./3., 0.0, temp);
cvThreshold(temp, dst, 100, 255, CV_THRESH_BINARY);
cvReleaseImage(&image_r);
cvReleaseImage(&image_g);
cvReleaseImage(&image_b);
cvReleaseImage(&temp);
}