2019-07-20 10:04:40 qq_35306281 阅读数 174
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20152 人正在学习 去看看 AI100讲师

@转载请注明出处
积分图:
假设原图图幅wxh,则积分图图幅为(w+1)*(h+1)。
积分图第一行和第一列全为0,其余点为图像像素点左上角所有像素值的和。
计算方法有两种:

  • 方法1.计算前一行当前列的和,加上当前行,该列前所有像素值的和。
  • 方法2.左边像素点的积分和,加上上一行当前列的积分和,减去上一行左边像素的积分和,加上当前像素值。
    假设要求像素点(x,y)的积分和,左边像素点为(x-1,y),上一行当前列(x,y-1),上一行左边像素(x-1,y-1)。
    ii(x,y) = ii(x-1,y) + ii(x,y-1) - ii(x-1,y-1) + f(x,y).

均值滤波
主要用于降噪。一般计算3x3或5x5区域的平均值。因而可以用积分图,计算3x3区域的和,然后求平均值。

#include <opencv2/opencv.hpp>
#include <iostream>

int* create_integra_map(unsigned char* src, int rows, int cols)
{
	int r,c,size;
	int* map;
	unsigned char* ptr;
	int* maplast;
	int* mapnow;
	int sum = 0;
	size = sizeof(int)*(rows+1)*(cols+1);
	map = (int*)malloc(size);
	memset(map,0,size);

	for(r = 0; r < rows; r++)
	{
		ptr = src + r*cols;
		maplast = map + r * (cols + 1) + 1;
		mapnow = map + (r + 1) * (cols + 1) + 1;
		mapnow[-1] = 0;
		for(c = 0, sum = 0; c < cols; c++)
		{
			sum += ptr[c];
			mapnow[c] = maplast[c] +sum;
		}
	}
	return map;
}

void meanBlur(unsigned char* src, int rows, int cols, unsigned char* dst)
{
	unsigned char* ptr;
	int r,c,sum;
	int *maplast, *mapnext;
	unsigned char* out;
	int* maps = create_integra_map(src, rows, cols);
	for(r = 1; r < rows - 1; r++)
	{
		ptr = src + r*cols;
		maplast = maps + (r-1)*(cols+1) + 1;
		mapnext = maps + (r+2)*(cols+1) + 1;
		out = dst + r * cols;
		for(c = 1; c < cols - 1; c++)
		{
			sum = mapnext[c+1] + maplast[c-2] - (mapnext[c-2] + maplast[c+1]);
			out[c] = (int)(sum / 9.0f);
		}
	}
	free(maps);
}
int main()
{
	cv::Mat src = cv::imread("lena.jpg", 0);
	cv::Mat dst(src.size(),src.type(),cv::Scalar::all(0));
	meanBlur(src.data, src.rows, src.cols, dst.data);
	cv::imshow("meanblur.jpg", dst);
	cv::waitKey(0);
	return 0;
}
2017-01-08 00:51:49 lwqBrell 阅读数 1649
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20152 人正在学习 去看看 AI100讲师

一、新建win32程序


二、开始编码

#include"stdafx.h"
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{   
    Mat src = imread("1.jpg");//载入原始图
    Mat dst;
    imshow("均值滤波【原图】", src);    //显示原始图
    blur(src, dst, Size(7, 7)); //进行均值滤波操作
    imshow("均值滤波【效果图】", dst);//显示效果图
    waitKey(0);
}

三、运行效果

这里写图片描述


这里写图片描述


参考文章:http://blog.csdn.net/cau_eric/article/details/27378503

2017-06-12 14:53:30 u011776903 阅读数 4888
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20152 人正在学习 去看看 AI100讲师

1.均值滤波

        含义:把每个像素都用周围的8个像素来做均值操作 。

均值滤波器有什么用处呢?

      主要还是平滑图像的用处, 有的图像的锐度很高,用这样的均值算法,可以把锐度降低。使得图像看上去更加自然。(只能微弱的降低噪声,不能剔除噪声,对降噪几乎没用)

源码:

#include "highgui.h"    
#include "cv.h"    

void MeanFilter(uchar* smooth, int width, int height)
{
		    
	int sum = height * width * sizeof(uchar);//图像所占内存容量     
	uchar *corrupted = (uchar*)malloc(sum);
	memcpy((char*)corrupted, (char*)smooth, sum);
	
	for (int j = 1; j<height - 1; j++)
	{
		for (int i = 1; i<width - 1; i++)
		{
			smooth[j*width + i] = (corrupted[(j - 1)*width + (i - 1)] + corrupted[(j - 1)*width + i] + corrupted[(j - 1)*width + (i + 1)] +
				corrupted[j*width + (i - 1)] + corrupted[j*width + i] + corrupted[j*width + (i + 1)] +
				corrupted[(j + 1)*width + (i - 1)] + corrupted[(j + 1)*width + i] + corrupted[(j + 1)*width + (i + 1)]) / 9;
		}
	}
}

void imgOperate(IplImage* image)
{
	cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);
	cvShowImage("image-in", image);
	//将色彩图像强制转化为灰度图像    
	IplImage* pGrayImg = NULL;
	IplImage* pImg = NULL;
	pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);
	pImg = cvCreateImage(cvGetSize(image), 8, 1);
	cvCvtColor(image, pGrayImg, CV_RGB2GRAY);
	//添加高斯噪声  
	cvZero(pImg);
	CvRNG rng = cvRNG(-1);  //初始化随机数发生器  
	cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));
	cvAdd(pGrayImg, pImg, pImg);
	cvShowImage("image-access", pImg);
	MeanFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);
	cvShowImage("image-out", pImg);
	cvReleaseImage(&pGrayImg);
	cvWaitKey(0);
	cvDestroyWindow("image-in");
	cvDestroyWindow("image-out");
}

int main()
{
	IplImage* img = cvLoadImage("E:\\11.jpg");
	imgOperate(img);
	cvReleaseImage(&img);
	return 0;
}




2.中值滤波

        均值滤波是像素周围的3*3的像素做平均值操作, 那么中值就是在3*3中的像素中寻找中值。


        可以清晰地看到, 这里的6,2,0,3,97,4,19,3,10这些像素最终都被中值4取代。

源码:

#include "highgui.h"    
#include "cv.h"    

void MedianFilter(uchar* smooth, int width, int height)
{
		    
	int sum = height * width * sizeof(uchar);//图像所占内存容量     
	uchar *corrupted = (uchar*)malloc(sum);
	memcpy((char*)corrupted, (char*)smooth, sum);
	
	for (int j=1;j<height-1;j++)  
    {  
        for (int i=1;i<width-1;i++)  
        {  
            int k = 0;  
            unsigned char window[9];  
            for (int jj = j - 1; jj < j + 2; ++jj)  
                for (int ii = i - 1; ii < i + 2; ++ii)  
                    window[k++] = corrupted[jj * width + ii];  
            //   Order elements (only half of them)  
            for (int m = 0; m < 5; ++m)  
            {  
                int min = m;  
                for (int n = m + 1; n < 9; ++n)  
                    if (window[n] < window[min])  
                        min = n;  
                //   Put found minimum element in its place  
                unsigned char temp = window[m];  
                window[m] = window[min];  
                window[min] = temp;				
            }  
            smooth[ j*width+i ] = window[4];
			//printf("%d\n", window[4]);
        }  
    }  
}

void imgOperate(IplImage* image)
{
	cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);
	cvShowImage("image-in", image);
	//将色彩图像强制转化为灰度图像    
	IplImage* pGrayImg = NULL;
	IplImage* pImg = NULL;
	pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);
	pImg = cvCreateImage(cvGetSize(image), 8, 1);
	cvCvtColor(image, pGrayImg, CV_RGB2GRAY);
	//添加高斯噪声  
	cvZero(pImg);
	CvRNG rng = cvRNG(-1);  //初始化随机数发生器  
	cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));
	cvAdd(pGrayImg, pImg, pImg);
	cvShowImage("image-access", pImg);
	MedianFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);
	cvShowImage("image-out", pImg);
	cvReleaseImage(&pGrayImg);
	cvWaitKey(0);
	cvDestroyWindow("image-in");
	cvDestroyWindow("image-out");
}

int main()
{
	IplImage* img = cvLoadImage("E:\\11.jpg");
	imgOperate(img);
	cvReleaseImage(&img);
	return 0;
}


3.混合中值滤波器(Hybrid Median Filter


        首先当前像素的上下左右和自身取中值 , 然后左上右上左下右下和自身取中值 , 完了前面的两个值和当前像素值再取一次中值 , 得到的值就是最后的终极像素值了。

#include "highgui.h"    
#include "cv.h"    

unsigned char median(unsigned char* elements, int width)
{
	//   Order elements (only half of them)  
	for (int i = 0; i < (width >> 1) + 1; ++i)
	{
		//   Find position of minimum element  
		int min = i;
		for (int j = i + 1; j < width; ++j)
		if (elements[j] < elements[min])
			min = j;
		//   Put found minimum element in its place  
		unsigned char temp = elements[i];
		elements[i] = elements[min];
		elements[min] = temp;
	}
	//   Get result - the middle element  
	return elements[width >> 1];
}


void hybridMedianFilter(uchar* smooth, int width, int height)
{

	int sum = height * width * sizeof(uchar);//图像所占内存容量     
	uchar *corrupted = (uchar*)malloc(sum);
	memcpy((char*)corrupted, (char*)smooth, sum);

	for (int j = 1; j<height - 1; j++)
	{
		for (int i = 1; i<width - 1; i++)
		{
			unsigned char window[5];
			unsigned char results[3];
			//   Pick up cross-window elements  
			window[0] = corrupted[(j - 1) * width + i];
			window[1] = corrupted[j * width + i - 1];
			window[2] = corrupted[j * width + i];
			window[3] = corrupted[j * width + i + 1];
			window[4] = corrupted[(j + 1) * width + i];
			//   Get median  
			results[0] = median(window, 5);
			//   Pick up x-window elements  
			window[0] = corrupted[(j - 1) * width + i - 1];
			window[1] = corrupted[(j - 1) * width + i + 1];
			window[2] = corrupted[j * width + i];
			window[3] = corrupted[(j + 1) * width + i - 1];
			window[4] = corrupted[(j + 1) * width + i + 1];
			//   Get median  
			results[1] = median(window, 5);
			//   Pick up leading element  
			results[2] = corrupted[j * width + i];
			//   Get result  
			smooth[j*width + i] = median(results, 3);
		}
	}
}

void imgOperate(IplImage* image)
{
	cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);
	cvShowImage("image-in", image);
	//将色彩图像强制转化为灰度图像    
	IplImage* pGrayImg = NULL;
	IplImage* pImg = NULL;
	pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);
	pImg = cvCreateImage(cvGetSize(image), 8, 1);
	cvCvtColor(image, pGrayImg, CV_RGB2GRAY);
	//添加高斯噪声  
	cvZero(pImg);
	CvRNG rng = cvRNG(-1);  //初始化随机数发生器  
	cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));
	cvAdd(pGrayImg, pImg, pImg);
	cvShowImage("image-access", pImg);
	hybridMedianFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);
	cvShowImage("image-out", pImg);
	cvReleaseImage(&pGrayImg);
	cvWaitKey(0);
	cvDestroyWindow("image-in");
	cvDestroyWindow("image-out");
}

int main()
{
	IplImage* img = cvLoadImage("E:\\11.jpg");
	imgOperate(img);
	cvReleaseImage(&img);
	return 0;
}


2009-07-06 14:59:00 hhygcy 阅读数 23352
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20152 人正在学习 去看看 AI100讲师

原来是不做图像处理这块的, 所以对这里的专用名字不是特别感冒, 滤波器听来玄而又玄。真正拿来看了之后就不过尔尔了, 这把拿了一个均值滤波器的例子来做记录, 希望可以依次把一些median filter, gaussian blur都拿来说说。

好吧言归正传, 这里就具体说说均值滤波器是什么东西吧。其实这个东西就是在图像处理的时候, “把每个像素都用周围的8个像素来做均值操作 ”, 比如说这里有一个例子:

 

sample

图通常是最能说明问题的东西, 非常明显的, 这个3*3区域像素的颜色值分别是5,3,6,2,1,9,8,4,7那么中间的1这个像素的过滤后的值就是这些值的平均值, 也就是前面的计算方法: (5+3+6+2+1+9+8+4+7)/9=5

一目了然。那么这个均值滤波器有什么用处呢?

主要还是平滑图像的用处, 有的图像的锐度很高,用这样的均值算法,可以把锐度降低。使得图像看上去更加自然,下面就有几幅图我们可以看出一些端倪:

原图:                                                                          平滑处理之后:

这里还是可以明显的感觉到不同的, 没有好坏之分,就是第二幅图片看上去更为平滑。 继续我们的问题, 那这里均值平滑是否具有去除噪声的功能呢? 我们搞来了椒盐噪声(就是随机的白点,黑点)来试试手:

噪声图(5%):                                                         平滑处理之后:

首先这里的噪声还是比较小的, 只有5%,从均值的效果来看的话, 我可以说几乎没有用,其实直观的想也可以判断, 因为这里的处理并没有剔除这些噪声点, 而只是微弱地降低了噪声,所以效果可以想见的。。

好吧, 最后的时候还是贴上一段处理的代码:

说明一下,我比较偷懒。一般处理的时候通常还有边界上的一些处理, 但是我这里就简单的从1...width-1来处理, 所以第一个和最后一个像素就简单的抛掉了, 如果只是简单的看看效果还是没有问题的!

2016-05-03 09:49:55 u013372900 阅读数 1459
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20152 人正在学习 去看看 AI100讲师
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;
Mat g_srcImage;     // 全局的源图像
// 分别对应全局的方框滤波、均值滤波、高斯滤波、中值滤波、双边滤波的输出图像以及内核值/参数值
Mat g_dstImgBox, g_dstImgBlur, g_dstImgGaussian, g_dstImgMedian, g_dstImgBilateral;
int g_BoxFilterVal = 5;
int g_BlurVal = 12;
int g_GaussianBlurVal = 5;
int g_MedianBlurVal = 12;
int g_BilateralFilterVal = 12;
static void on_BoxFilter(int, void *);
static void on_Blur(int, void *);
static void on_GaussianBlur(int, void *);
static void on_MedianBlur(int, void *);
static void on_BilateralFilter(int, void*);
int main()
{
    // 读取图像到g_srcImage
    g_srcImage = imread("6013202130.jpg");
    if (!g_srcImage.data) {
        printf("读取的图片不存在…… \n");
        return false;
    }

    // 分别克隆原图到5中滤波所需的图像中,均为Mat类型
    g_dstImgBox = g_srcImage.clone();
    g_dstImgBlur = g_srcImage.clone();
    g_dstImgGaussian = g_srcImage.clone();
    g_dstImgMedian = g_srcImage.clone();
    g_dstImgBilateral = g_srcImage.clone();

    // 显示原图
    namedWindow("【原图】", 1);
    imshow("【原图】", g_srcImage);
    namedWindow("【均值滤波】", 1);
    createTrackbar("内核值", "【均值滤波】", &g_BlurVal, 30, on_Blur);
    on_Blur(g_BlurVal, 0);
    namedWindow("【高斯滤波】", 1);
    createTrackbar("内核值", "【高斯滤波】", &g_GaussianBlurVal, 30, on_GaussianBlur);
    on_GaussianBlur(g_GaussianBlurVal, 0);
    namedWindow("【中值滤波】", 1);
    createTrackbar("内核值", "【中值滤波】", &g_MedianBlurVal, 30, on_MedianBlur);
    on_MedianBlur(g_MedianBlurVal, 0);
    cout << "按下“q”键时,程序退出……\n";
    while (char(waitKey(1)) != 'q') {}
    return 0;
}

static void on_Blur(int, void *)
{
    blur(g_srcImage, g_dstImgBlur, Size(g_BlurVal + 1, g_BlurVal + 1),
        Point(-1, -1));
    imshow("【均值滤波】", g_dstImgBlur);
}

static void on_GaussianBlur(int, void *)
{
    GaussianBlur(g_srcImage, g_dstImgGaussian, Size(g_GaussianBlurVal * 2 + 1,
        g_GaussianBlurVal * 2 + 1), 0, 0);
    imshow("【高斯滤波】", g_dstImgGaussian);
}

static void on_MedianBlur(int, void *)
{
    medianBlur(g_srcImage, g_dstImgMedian, g_MedianBlurVal * 2 + 1);
    imshow("【中值滤波】", g_dstImgMedian);
}

没有更多推荐了,返回首页