自适应积分的函数的编写

最近在写软件,需要用到积分。我们采用多个矩形累加的方法,很容易实现积分的功能,但是这个方法有一个问题:我们不知道把a~b之间分成多少份,也就是不知道n取多少。如果n太小,计算结果精度较低,n太大,则计算量太大,且过高的精度在工程上也没有意义。

在这里插入图片描述

这里我们采用自适应的方式,让程序自己选择n的大小。我们首先定义两个要积分的函数f1和f2。

double f1(double x)
{
   
	return 1/x;
}

double f2(double x)
{
   
	return 1/(x * x);
}

下面是积分函数:
4个参数的意义:
a:积分的起点;
b:积分的终点;
n:从a到b,一共分成n份。这个n是另一个函数指定的。
myFun: 函数指针,可以用来指定对f1还是f2进行积分。

//从a到b的积分,但不一定精确 
//第三个参数是一个函数指针,申明的时候一定要注意函数名后面带上参数列表
//这时,函数名就可以被当做参数传递到函数中
double jifen(double a, double b, int n, double (*myFun)(double))
{
   	
	//把被积分的区域a~b等分成n块。dx就是每一块的宽度。
	//在数学上,并没有要求每一块的宽度相等。这里为了简单起见,采取等分 
	double dx = (b - a) /n;  
	
	double sum = 0;
	double x; //具体的x的位置 
	
	for(int i = 0; i < n ; i++)
	{
   
		x = a + dx * i;	//动态更新x的值 
		
		//myFun相当于C#中的delegation (委托)
		//直接使用形参中的函数指针调用不同的函数,例如f1和f2 
		//矩形法计算一小块矩形的面积,并进行累加 
		sum += myFun(x) * dx; 
	}

	return sum;
}

在编写完基本的积分函数之后,我们开始编写能决定jifen()中n的值的函数jifen2()。这是这段程序的关键所在。
在积分的定义上,并没有规定把a和b之间的距离进行等分,只规定每一份之间的距离都是无穷小 (dx->0)。为了简便起见,我们把a和b之间的距离进行等分。
我们采用的思路是:如果把a和b之间的距离等分成n份进行计算积分值,得到一个结果r1;如果把a和b之间的距离等分成10 * n份进行计算积分值,得到一个结果r2。随着n的增大,积分值距离真正的精确值越来越近,提高的幅度也越来越小。如果r1和r2之间的差距太大,则需要继续增大n的值。如果r1和r2之间的差距 < 0.1%,则我们认为r1和r2都是比较准确的值。r1和r2之间的差距很小时,r1和r2都与真实值很接近,它们与真实值之间的差距也很小。据此,我们写下如下程序:我们要求两个结果之间的差距 < 0.1%。

//最大误差为0.1%的积分 
//第三个参数是一个函数指针,申
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Python编写自适应积分二值化代码的示例: ```python import cv2 def adaptive_integral_thresholding(image, block_size=51, constant=2): # Convert the image to grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Calculate the integral image integral = cv2.integral(gray) # Initialize the output image output = gray.copy() # Loop through each pixel in the image for i in range(gray.shape[0]): for j in range(gray.shape[1]): # Calculate the coordinates of the block around the pixel y1 = max(0, i - block_size // 2) y2 = min(gray.shape[0] - 1, i + block_size // 2) x1 = max(0, j - block_size // 2) x2 = min(gray.shape[1] - 1, j + block_size // 2) # Calculate the sum and count of pixels in the block count = (y2 - y1 + 1) * (x2 - x1 + 1) if y1 == 0 and x1 == 0: # Special case for the top left corner of the image s = integral[y2, x2] elif y1 == 0: # Special case for the top row of the image s = integral[y2, x2] - integral[y2, x1 - 1] elif x1 == 0: # Special case for the left column of the image s = integral[y2, x2] - integral[y1 - 1, x2] else: # General case s = integral[y2, x2] - integral[y2, x1 - 1] - integral[y1 - 1, x2] + integral[y1 - 1, x1 - 1] # Calculate the threshold for the block threshold = (s / count) + constant # Set the pixel value in the output image if gray[i, j] > threshold: output[i, j] = 255 else: output[i, j] = 0 return output ``` 该函数接受一个彩色图像并返回一个二值化图像,使用自适应积分阈值技术。它计算图像的积分图像,然后对每个像素计算其周围的块的平均值,并使用该平均值加上一个常数作为阈值。如果像素的值大于阈值,则将其设置为255(白色),否则将其设置为0(黑色)。该函数使用默认的块大小为51和常数为2,但可以使用函数的参数进行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值