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


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

    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);
  • 相关阅读:
    摘花生
    JAVA-初步认识-第三章-程序的流程控制
    JAVA-初步认识-第三章-小结
    JAVA-初步认识-第三章-三元运算符
    JAVA-初步认识-第三章-移位运算符练习
    JAVA-初步认识-第三章-移位运算符
    JAVA-初步认识-第三章-位运算符
    JAVA-初步认识-第三章-逻辑运算符(&&和||)
    JAVA-初步认识-第二章-算术运算符2续
    JAVA-初步认识-第三章-比较运算符逻辑运算符
  • 原文地址:https://www.cnblogs.com/yangxi/p/2173350.html
Copyright © 2020-2023  润新知