图像旋转、膨胀、腐蚀的实现
2011-09-10 21:17
302 查看
自己写的,不免有问题,欢迎纠正。
1.旋转
2.膨胀
3.腐蚀
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);
相关文章推荐
- 图像的膨胀与腐蚀实现
- 图像二值形态学——腐蚀和膨胀的C语言实现
- 图像膨胀与腐蚀实现
- java实现的图像腐蚀、膨胀运算
- 图像腐蚀、膨胀、基本原理和程序实现
- Visual C++实现二值图像处理 - 腐蚀和膨胀
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- 图像旋转算法与实现
- 图像旋转c++实现
- 图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
- python opencv3图像膨胀和腐蚀
- 图像腐蚀和膨胀
- [置顶] C++实现图像的各种旋转操作
- Matlab 实现图像的平移,旋转,缩放
- opencv实现图像任意角度旋转的算法解析及代码实现
- Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量
- Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
- 图像的腐蚀与膨胀
- 实现应用Matrix旋转图像
- 【练习5.4】图像求差及膨胀腐蚀