void Ctry::OnTryTyr1() { IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\pic1.jpg", -1); IplImage* pic = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); CvScalar pixel; for (int i = 1; i < img->height-1; i++) { for (int j = 1; j < img->width-1; j++) { pixel = lookfor(cvGet2D(img, i - 1, j - 1), cvGet2D(img, i - 1, j), cvGet2D(img, i - 1, j + 1), cvGet2D(img, i, j - 1), cvGet2D(img, i, j), cvGet2D(img, i, j + 1), cvGet2D(img, i + 1, j - 1), cvGet2D(img, i + 1, j), cvGet2D(img, i + 1, j + 1)); cvSet2D(pic, i, j, pixel); } } CvScalar pixel1, pixel2; //设置左右竖直方向边缘的像素点 for (int i = 0; i < img->height; i++) { pixel1 = cvGet2D(img, i, 0); pixel2 = cvGet2D(img, i, img->width-1); cvSet2D(pic, i, 0, pixel1); cvSet2D(pic, i, img->width-1, pixel2); } //设置上下水平方向边缘的像素点 for (int i = 1; i < img->width - 1; i++) { pixel1 = cvGet2D(img, 0, i); pixel2 = cvGet2D(img, img->height-1, i); cvSet2D(pic, 0, i, pixel1); cvSet2D(pic, img->height-1, i, pixel2); } cvSaveImage("C:\\Users\\Administrator\\Desktop\\pic2.jpg", pic); } CvScalar Ctry::lookfor(CvScalar p1, CvScalar p2, CvScalar p3, CvScalar p4, CvScalar p5, CvScalar p6, CvScalar p7, CvScalar p8, CvScalar p9) { vector<CvScalar > Pixel{ p1,p2,p3,p4,p5,p6,p7,p8,p9}; int num = 0; //记录第几个点的均方差值最大 double temp =0; double mean=0; //RGB像素均值 double dst; vector<double> Dst ; //均方差 Dst.clear(); //将每个像素点的均方差压入容器Dst中 for (auto i : Pixel) { mean = (i.val[0] + i.val[1] + i.val[2]) / 3; dst = (i.val[0] - mean)*(i.val[0] - mean) + (i.val[1] - mean)*(i.val[1] - mean) + (i.val[2] - mean)*(i.val[2] - mean); Dst.push_back(dst); } //提取最大值点和第几个像素的均方差值最大 temp = Dst[0]; for (int j = 0; j <9; j++) { if (Dst[j]>temp) { temp = Dst[j]; num = j; } } return Pixel[num]; }
效果图: