C 如何以最少的for循环数循环通过像素块
我有一个宽*高像素的图像,我想在其中循环像素块,比如说10*10的块大小。如何使用最少数量的循环来实现这一点 我尝试过先循环每一列,然后循环每一行,从这两个外部循环中获取起始x和y位置。然后循环从块的起始位置开始循环,直到块大小并操纵像素。这将消耗四个嵌套循环C 如何以最少的for循环数循环通过像素块,c,for-loop,image-processing,C,For Loop,Image Processing,我有一个宽*高像素的图像,我想在其中循环像素块,比如说10*10的块大小。如何使用最少数量的循环来实现这一点 我尝试过先循环每一列,然后循环每一行,从这两个外部循环中获取起始x和y位置。然后循环从块的起始位置开始循环,直到块大小并操纵像素。这将消耗四个嵌套循环 for (int i = 0; i < Width; i+=Block_Size) { for (int j = 0; j < Height; j+=Block_Size) { for (int x = i; x
for (int i = 0; i < Width; i+=Block_Size) {
for (int j = 0; j < Height; j+=Block_Size) {
for (int x = i; x < i + Block_Size; x++) {
for (int y = j; y < j + Block_Size; y++) {
//Get pixel values within the block
}
}
}
}
for(int i=0;i
可以通过三个循环来实现这一点,但为了实现这一点,您需要存储关于每个像素块的起始位置以及总共有多少像素块的信息与此无关,图像的宽度和高度都必须是
块大小的倍数
以下是三个循环的实现方式:
int numberOfBlocks = x;
int pixelBlockStartingPoints[numberOfBlocks] = { startingPoint1, startingPoint2, ... };
for(int i = 0; i < numberOfBlocks; i++){
for(int j = pixelBlockStartingPoints[i]; j < pixelBlockStartingPoint[i] + Block_Size; j++){
for(int k = pixelBlockStartingPoints[i]; k < pixelBlockStartingPoint[i] + Block_Size; k++){
// Get Pixel-Data
}
}
}
int numberOfBlocks=x;
int pixelBlockStartingPoints[numberOfBlocks]={startingPoint1,startingPoint2,…};
对于(int i=0;i
如何使用最少数量的循环来实现这一点
可以通过完全展开任意多个循环级别来减少循环的数量。对于固定的光栅尺寸,您可以将它们全部展开,从而产生一个(可能很长)具有零循环的实现。对于已知的Block\u Size
可以展开一个或两个内部循环,而不管整体尺寸是否已知,只剩下两个循环
但是你为什么会考虑这样的事情呢?这个问题似乎假设减少循环嵌套的深度会有某种固有的优势,但这不一定是真的,而且可能产生的任何影响都可能很小
我倾向于猜测您已经研究了一点计算复杂性理论,并且去掉了深循环嵌套必然会产生较差的扩展性能,或者甚至深循环嵌套固有的较差性能的想法。这些都是错误的观念,尽管是相对常见的观念,但无论如何,他们都会把问题向后看
循环嵌套的性能如何扩展的主要考虑因素是最内层循环体的多少倍
,执行。对于任何合理的方法,无论涉及多少个循环,对于光栅中的每一个像素,您都将获得大致相同的性能。在这种情况下,代码清晰应该是您的目标,您最初的四个循环嵌套非常清晰。好吧,没有其他方法可以做到这一点。四个循环是最小的。如果您关心性能或时间复杂度,拥有四个循环并不意味着什么,考虑到您的操作方式,它仍然是Θ(n)(n是像素数)。如果循环困扰您,请使用递归。也许讨论您对四个循环嵌套的关注会有所帮助,为什么你认为减少循环的数量会对你有利呢“。别担心,循环的供应并不有限。我们不会用完循环。尽可能多地使用循环来完成任务。代码没有问题。谢谢你的建议。我们将尝试使用支持阵列,这如何处理不包含光栅主对角线的块?我假设j
和k
表示像素坐标,在每种情况下,它们的起始值都相同。@JohnBollinger是的,j
和k
对于每个像素块都是临时的,它们存储像素相对于像素块起始点的宽度和高度。就像我说的,在为了使其工作,您需要知道所有块的位置以及该块中第一个像素的位置(这是存储在pixelBlockStartingPoints
-数组中的,从我所看到的,那么,你的j
和k
与OP的x
和y
不同,这使得这个答案对我的眼睛有点误导。x
和y
的计算细节来自j
和 k
将取决于如何从二维光栅坐标计算单起点值,但可能取决于光栅的尺寸。当然,没有理由认为这将比4环嵌套具有更好的性能特征,因此无论它呈现何种外观,都会产生误导恰恰相反。
//Get pixel values within the block