【练习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 }

结果图片:

时间: 2024-10-10 13:26:04

【练习5.8】使用随机数初始化图像、 双边滤波的相关文章

【OPENCV入门之六】非线性滤波(中值滤波、双边滤波)

参考网站: http://blog.csdn.net/poem_qianmo/article/details/23184547 在很多情况下,比如在噪声是散粒噪声而不是高斯噪声时(图像偶尔会出现很大的值的时候),在这种情况下,用高斯滤波器对图像进行模糊的话,噪声是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒.而用非线性滤波会更好些. 1.中值滤波(Median filter)--medianBlur函数 该方法在去除脉冲噪声.斑点噪声(speckle noise).椒盐噪声(salt-a

双边滤波算法原理及实现

双边滤波算法原理 双边滤波是一种非线性滤波器,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布[1].最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度.颜色强度,深度距离等),在计算中心像素的时候同时考虑这两个权重. 双边滤波的核函数是空间域核与像素范围域核的

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

双边滤波

Qt 平台,双边滤波原理代码例如以下: #include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <cmath> using namespace cv; usi

Bilateral Filtering(双边滤波) for SSAO

原网址:http://blog.csdn.net/bugrunner/article/details/7170471 1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪.Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用.一般的高斯模糊在进行采样

Bilateral Filtering(双边滤波) for SSAO(转)

原文链接:http://blog.csdn.net/bugrunner/article/details/7170471 另外一篇相似的英文资料:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html#Index   1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用b

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

数字图像处理(三):高斯滤波和双边滤波

1.高斯滤波 clear all;clc;close all %% 彩色to灰度 img=imread('Fig0631(a)(strawberries_coffee_full_color).jpg'); gray=rgb2gray(img); %把彩色图片转化成灰度图片 figure(1),imshow(gray),title('彩色原始图像转灰色图像)'); %显示原始图像 gray=imnoise(gray,'gaussian',0,0.001); %加入均值为0,方差为0.001的高斯噪

OpenCv高斯,中值,均值,双边滤波

#include "cv.h" #include "highgui.h" #include <iostream> using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat src = imread("misaka.jpg"); Mat dst; //参数是按顺序写的 //高斯滤波 //src:输入图像 //dst:输出图像 //Siz