图像旋转、膨胀、腐蚀的实现

自己写的,不免有问题,欢迎纠正。

1.旋转

 1 //旋转
2 int size = sqrt(p_img->width/2 * p_img->width/2 + p_img->height/2 * p_img->height/2);
3 IplImage* dst = cvCreateImage(cvSize(size*2, size*2), IPL_DEPTH_8U, 3);
4 RgbImage spin(dst);
5
6 int angle = 290; //旋转角度
7 for(int i = 0; i < p_img->height; i++) {
8 for(int j = 0; j < p_img->width; j++) {
9 int ii = i - p_img->height/2;
10 int jj = j - p_img->width/2;
11 int d = sqrt(jj * jj + ii * ii);
12 float a = atan2(ii, jj) - (angle * CV_PI / 180);
13 int h = size + sin(a) * d;
14 int w = size + cos(a) * d;
15
16 spin[h][w].b = img[i][j].b;
17 spin[h][w].g = img[i][j].g;
18 spin[h][w].r = img[i][j].r;
19 }
20 }
21
22 //旋转后处理
23 for(int i = 1; i < dst->height-1; i++) {
24 for(int j = 1; j < dst->width-1; j++) {
25 if(spin[i][j].b == 0 && spin[i][j].g == 0 && spin[i][j].r == 0) {
26 spin[i][j].b = (spin[i-1][j].b + spin[i][j-1].b + spin[i][j+1].b + spin[i+1][j].b) / 4;
27 spin[i][j].g = (spin[i-1][j].g + spin[i][j-1].g + spin[i][j+1].g + spin[i+1][j].g) / 4;
28 spin[i][j].r = (spin[i-1][j].r + spin[i][j-1].r + spin[i][j+1].r + spin[i+1][j].r) / 4;
29 }
30 }
31 }

2.膨胀

 1 //膨胀 (f㈩b)(s,t) = max{f(s-x,t-y)+b(x,y) | (s-x,t-y)∈Df;(x,y)∈Db}
2 IplImage* p_b = cvCreateImage(cvSize(3, 3), IPL_DEPTH_8U, 1);
3 BwImage b(p_b);
4
5 IplImage* gimg = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
6 BwImage gimgA(gimg);
7 IplImage* dst = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
8 BwImage dilate(dst);
9
10 //彩色图像->灰度图像
11 //cvCvtColor(p_img, dst, CV_BGR2GRAY); // cimg -> gimg
12 for(int i = 0; i < p_img->height; i++) {
13 for(int j = 0; j < p_img->width; j++) {
14 gimgA[i][j] = (uchar)(img[i][j].b*0.114 + img[i][j].g*0.587 + img[i][j].r*0.299);
15 }
16 }
17
18 //膨胀处理
19 for(int s = 0; s < dst->height; s++) {
20 for(int t = 0; t < dst->width; t++) {
21 uchar temp = 0;
22 for(int x = 0; x < p_b->height; x++) {
23 for(int y = 0; y < p_b->width; y++) {
24 temp = gimgA[s-x][t-y] + b[x][y];
25 if(temp > dilate[s][t]) {
26 dilate[s][t] = temp;
27 }
28 }
29 }
30
31 }
32 }
33
34 cvReleaseImage(&p_b);
35 cvReleaseImage(&gimg);

3.腐蚀

 1 //腐蚀  (f㈠b)(s,t) = min{f(s+x,t+y)-b(x,y) | (s+x,t+y)∈Df;(x,y)∈Db}
2 IplImage* p_b = cvCreateImage(cvSize(3, 3), IPL_DEPTH_8U, 1);
3 BwImage b(p_b);
4
5 IplImage* gimg = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
6 BwImage gimgA(gimg);
7 IplImage* dst = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
8 BwImage erode(dst);
9
10 //彩色图像->灰度图像
11 for(int i = 0; i < p_img->height; i++) {
12 for(int j = 0; j < p_img->width; j++) {
13 gimgA[i][j] = (uchar)(img[i][j].b*0.114 + img[i][j].g*0.587 + img[i][j].r*0.299);
14 erode[i][j] = 255; //初始化
15 }
16 }
17
18 //腐蚀处理
19 for(int s = 0; s < dst->height; s++) {
20 for(int t = 0; t < dst->width; t++) {
21 uchar temp = 0;
22 for(int x = 0; x < p_b->height; x++) {
23 for(int y = 0; y < p_b->width; y++) {
24 temp = gimgA[s+x][t+y] - b[x][y];
25 if(temp < erode[s][t]) {
26 erode[s][t] = temp;
27 }
28 }
29 }
30
31 }
32 }
33
34 cvReleaseImage(&p_b);
35 cvReleaseImage(&gimg);
原文地址:https://www.cnblogs.com/yangxi/p/2173350.html