您的位置:首页 > 其它

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

2011-09-10 21:17 302 查看
自己写的,不免有问题,欢迎纠正。

1.旋转

//旋转
int size = sqrt(p_img->width/2 * p_img->width/2 + p_img->height/2 * p_img->height/2);
IplImage* dst = cvCreateImage(cvSize(size*2, size*2), IPL_DEPTH_8U, 3);
RgbImage spin(dst);

int angle = 290;                             //旋转角度
for(int i = 0; i < p_img->height; i++) {
for(int j = 0; j < p_img->width; j++) {
int ii = i - p_img->height/2;
int jj = j - p_img->width/2;
int d = sqrt(jj * jj + ii * ii);
float a = atan2(ii, jj) - (angle * CV_PI / 180);
int h = size + sin(a) * d;
int w = size + cos(a) * d;

spin[h][w].b = img[i][j].b;
spin[h][w].g = img[i][j].g;
spin[h][w].r = img[i][j].r;
}
}

//旋转后处理
for(int i = 1; i < dst->height-1; i++) {
for(int j = 1; j < dst->width-1; j++) {
if(spin[i][j].b == 0 && spin[i][j].g == 0 && spin[i][j].r == 0) {
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;
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;
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;
}
}
}


2.膨胀

//膨胀 (f㈩b)(s,t) = max{f(s-x,t-y)+b(x,y) | (s-x,t-y)∈Df;(x,y)∈Db}
IplImage* p_b = cvCreateImage(cvSize(3, 3), IPL_DEPTH_8U, 1);
BwImage b(p_b);

IplImage* gimg = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
BwImage gimgA(gimg);
IplImage* dst = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
BwImage dilate(dst);

//彩色图像->灰度图像
//cvCvtColor(p_img, dst, CV_BGR2GRAY); // cimg -> gimg
for(int i = 0; i < p_img->height; i++) {
for(int j = 0; j < p_img->width; j++) {
gimgA[i][j] = (uchar)(img[i][j].b*0.114 + img[i][j].g*0.587 + img[i][j].r*0.299);
}
}

//膨胀处理
for(int s = 0; s < dst->height; s++) {
for(int t = 0; t < dst->width; t++) {
uchar temp = 0;
for(int x = 0; x < p_b->height; x++) {
for(int y = 0; y < p_b->width; y++) {
temp = gimgA[s-x][t-y] + b[x][y];
if(temp > dilate[s][t]) {
dilate[s][t] = temp;
}
}
}

}
}

cvReleaseImage(&p_b);
cvReleaseImage(&gimg);


3.腐蚀

//腐蚀  (f㈠b)(s,t) = min{f(s+x,t+y)-b(x,y) | (s+x,t+y)∈Df;(x,y)∈Db}
IplImage* p_b = cvCreateImage(cvSize(3, 3), IPL_DEPTH_8U, 1);
BwImage b(p_b);

IplImage* gimg = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
BwImage gimgA(gimg);
IplImage* dst = cvCreateImage(cvSize(p_img->width, p_img->height), IPL_DEPTH_8U, 1);
BwImage erode(dst);

//彩色图像->灰度图像
for(int i = 0; i < p_img->height; i++) {
for(int j = 0; j < p_img->width; j++) {
gimgA[i][j] = (uchar)(img[i][j].b*0.114 + img[i][j].g*0.587 + img[i][j].r*0.299);
erode[i][j] = 255;              //初始化
}
}

//腐蚀处理
for(int s = 0; s < dst->height; s++) {
for(int t = 0; t < dst->width; t++) {
uchar temp = 0;
for(int x = 0; x < p_b->height; x++) {
for(int y = 0; y < p_b->width; y++) {
temp = gimgA[s+x][t+y] - b[x][y];
if(temp < erode[s][t]) {
erode[s][t] = temp;
}
}
}

}
}

cvReleaseImage(&p_b);
cvReleaseImage(&gimg);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: