zoukankan      html  css  js  c++  java
  • 【练习5.8】使用随机数初始化图像、 双边滤波

    提纲
    题目要求
    程序代码
    结果图片

      

    题目要求:

     生成一个较小方差得随机图像(用一个随机变量,使其大部分数值的差异不超过3,其中大部分数值接近0),将此图像载入一个绘制程序,在图像上画一些辐射状相交于一点的线条。

    a、对图像使用双边滤波。

    程序代码:

      1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
      2 //
      3 //D:\Work\Work_Programming\Source\Image\lena.jpg
      4 
      5 
      6 #include "stdafx.h"
      7 #include <cv.h>
      8 #include <highgui.h>
      9 #include <iostream>
     10 #include <math.h>
     11 #include <stdlib.h>
     12 using namespace cv;
     13 using namespace std;
     14 //函数声明-->--->-->--->-->--->-->--->//
     15 
     16 double gaussrand(double E = 0.0, double V = 1.0);
     17 void InitialzieImageToRandomValue(IplImage * img);
     18 
     19 //<--<--<--<--<--<--<--<--<--函数声明//
     20 
     21 int _tmain(int argc, _TCHAR* argv[])
     22 {
     23     
     24     const char * fileName1 = "D:\Work\Work_Programming\Source\Image\OpenCVExerciseResult\Source_5-8_2.jpg";
     25     IplImage * src1 = cvLoadImage(fileName1, CV_LOAD_IMAGE_GRAYSCALE);
     26     assert(src1);
     27 
     28     //IplImage * img = cvCreateImage(cvSize(500, 500), IPL_DEPTH_8U, 1);
     29     //assert(img); 
     30     //cvZero(img);
     31     //InitialzieImageToRandomValue(img);
     32 
     33     cvNamedWindow("原始图像", 0);
     34     cvNamedWindow("题目_a", 0);
     35     //cvNamedWindow("题目_b", 0);
     36     //cvNamedWindow("题目_c", 0);
     37     ////cvNamedWindow("题目_d", 0);
     38 
     39     cvShowImage("原始图像", src1);
     40     /*char * imageName = "D:\Work\Work_Programming\Source\Image\OpenCVExerciseResult\Result_5-8.jpg";
     41     cvSaveImage(imageName, img);*/
     42 
     43     //---------------------------a:开始--------------------------------//
     44 
     45     IplImage * image_BIL = cvCloneImage(src1);
     46     IplImage * temp_image = cvCloneImage(src1);
     47     cvZero(temp_image);
     48     cvZero(image_BIL);
     49 
     50     cvSmooth(src1, temp_image, CV_BILATERAL, 3, 3, 11, 11);
     51 
     52     int j = 0;
     53     while (j < 100)
     54     {
     55         //注意:使用CV_BILATERAL平滑类型时cvSmooth参数中的最后两个11
     56         cvSmooth(temp_image, image_BIL, CV_BILATERAL, 7, 7, 11, 11);
     57         //cvSmooth(temp_image, image_BIL, CV_BILATERAL, 3, 3);
     58 
     59         cvCopyImage(image_BIL, temp_image);
     60         j++;
     61     }
     62     cvShowImage("题目_a", image_BIL);
     63     char * imageName = "D:\Work\Work_Programming\Source\Image\OpenCVExerciseResult\Result_5-8_Step2.jpg";
     64     cvSaveImage(imageName, image_BIL);
     65     //---------------------------a:结束--------------------------------//    
     66 
     67     cvWaitKey(0);
     68 
     69     cvReleaseImage(&src1);
     70     cvReleaseImage(&image_BIL);
     71     //cvReleaseImage(&cleandiff);
     72     //cvReleaseImage(&dirtydiff);
     73 
     74     cvDestroyWindow("原始图像");
     75     cvDestroyWindow("题目_a");
     76     //cvDestroyWindow("题目_b");
     77     //cvDestroyWindow("题目_c");
     78     ////cvDestroyWindow("题目_d");
     79 
     80 
     81     return 0;
     82 }
     83 
     84 //生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:X = X * V + E;
     85 //double gaussrand()
     86 //{
     87 //    static double V1, V2, S;
     88 //    static int phase = 0;
     89 //    double X;
     90 //
     91 //    if (phase == 0) {
     92 //        do {
     93 //            double U1 = (double)rand() / RAND_MAX;
     94 //            double U2 = (double)rand() / RAND_MAX;
     95 //
     96 //            V1 = 2 * U1 - 1;
     97 //            V2 = 2 * U2 - 1;
     98 //            S = V1 * V1 + V2 * V2;
     99 //        } while (S >= 1 || S == 0);
    100 //
    101 //        X = V1 * sqrt(-2 * log(S) / S);
    102 //    }
    103 //    else
    104 //        X = V2 * sqrt(-2 * log(S) / S);
    105 //
    106 //    phase = 1 - phase;
    107 //
    108 //    return X;
    109 //}
    110 
    111 //声称期望为E,方差为V的随机数
    112 double gaussrand(double E  , double V )
    113 {
    114     static double V1, V2, S;
    115     static int phase = 0;
    116     double X;
    117 
    118     if (phase == 0) {
    119         do {
    120             double U1 = (double)rand() / RAND_MAX;
    121             double U2 = (double)rand() / RAND_MAX;
    122 
    123             V1 = 2 * U1 - 1;
    124             V2 = 2 * U2 - 1;
    125             S = V1 * V1 + V2 * V2;
    126         } while (S >= 1 || S == 0);
    127 
    128         X = V1 * sqrt(-2 * log(S) / S);
    129     }
    130     else
    131         X = V2 * sqrt(-2 * log(S) / S);
    132 
    133     phase = 1 - phase;
    134 
    135     X = X * V + E;
    136     return X;
    137 }
    138 
    139 void InitialzieImageToRandomValue(IplImage * img)
    140 {
    141     int imgWidth = img->width;
    142     int imgHeight = img->height;
    143 
    144     if (img->nChannels == 1)
    145     {
    146         for (int h = 0; h < imgHeight; ++h)
    147         {
    148             for (int w = 0; w < imgWidth; ++w)
    149             {
    150                 int val = gaussrand(0.0, 3.0);
    151                 if (val >= 0)
    152                 {
    153                     cvSetReal2D(img, w, h, val);
    154                 }
    155                 else
    156                 {
    157                     w--;
    158                 }
    159             }
    160         }    
    161     }
    162 }

    结果图片:

  • 相关阅读:
    RF中selenium2Library的关键字--BrowserManagement
    excle脚本驱动+动态执行case
    unittest+HTMLtestrunner+SMTP发送邮件
    01.微博三方登录原理讲解
    图片验证码接口
    编写注册接口
    jwt安装配置
    jwt原理
    vue组件
    使用axios实现登录功能
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4444189.html
Copyright © 2011-2022 走看看