我正在输入黑/白像素值矩阵,然后我使用平均技术模糊内部。我有正确的循环程序,但我需要原始矩阵的常量副本,以便在单步执行时使用for循环。我怎么能这样做?
#include<iostream>
using namespace std;
/****blurImage*****************************************************************************************************
* main -- Program to blur a grayscale image given the pixel values and their location
*
* Arguments: none
*
* returns: 0
*****************************************************************************************************************/
void blurImage(int matrix[100][100], int matRow, int matCol, int image[100][100]);
int main(){
int matRow;
int matCol;
bool checkDataOk;
int matrix[100][100];
int image[100][100];
cout << "Enter Image Width (in pixels):";
cin >> matCol;
cout << "Enter Image Height (in pixels):";
cin >> matRow;
if (matRow <=0 || matCol <=0 )
checkDataOk = false;
else checkDataOk = true;
if(checkDataOk){
cout << "Enter Pixel Values (left-->right):" << endl;
int tmp;
for (int i = 0; i < matRow; i++)
{
for (int j = 0 ; j < matCol; j++)
{
cin >> tmp;
matrix[i][j] = tmp;
}
}
blurImage(matrix, matRow, matCol, image);
cout << endl;
cout << "Output:" << endl;
for(int i=0; i<matRow; i++){
for(int j=0; j<matCol; j++){
cout << matrix[i][j] << endl;
}
}
}
else cout << "Invalid Row/Column size";
return 0;
}
void blurImage(int matrix[100][100], int matRow, int matCol, int image[100][100]){
for(int i=1; i<(matRow-1); i++){ // start index at 1 and stop at -1 so we don't access outside the image
for(int j=1; j<(matCol-1); j++){
int total = 0;
for(int n=(i-1); n<(i+2); n++){ // start at the top left corner of our current index and loop the 3x3 sub-matrix adding to the total
for(int m=(j-1); m<(j+2); m++){
image = matrix;
total += image[n][m];
}
}
int avg = total/9; // get the average, and set the current index to the average
matrix[i][j] = avg;
}
}
}
如果我输入这个6x5矩阵:
0 0 255 0 0
0 255 0 255 0
255 255 0 255 255
255 255 255 255 255
255 0 0 0 255
255 0 0 0 255
0 0 255 0 0
我应该得到:
0 0 255 0 0
0 113 141 113 0
255 170 198 170 255
255 170 141 170 255
255 141 85 141 255
255 0 0 0 255
0 0 255 0 0
答案 0 :(得分:2)
这一行:
image = matrix;
实际上并不复制数组。如果我没有弄错的话,它是一个指针赋值(意味着image
现在将指向matrix
),而不是数据副本。
你想要的是:
memcpy(image, matrix, sizeof(image));
由于图像和矩阵是相同类型的数组,我们可以进行内存复制以传输内容。您也可以使用循环来执行复制,但这更简单,更快。
此外,这个操作在四个嵌套循环中会非常慢,所以这可能不是你想要做的。
注意:您需要#include <string.h>
才能使用memcpy。
答案 1 :(得分:0)
“但我需要一份不变的副本 for循环的原始矩阵 单步执行“
是的!因此,请勿在模糊功能中修改输入('矩阵')。只修改输出('图像')。
当blurImage()返回时,'matrix'将不被修改,'image'将包含结果。
因此,当您循环打印输出时,请使用“图像”而不是“矩阵”。如果你真的想把'image'复制成'matrix',就像Joey Adams所说的那样。
答案 2 :(得分:0)
这与您的问题只是切线相关,但无论如何你最终都会遇到这个问题,所以我会给你一个提醒。您执行过滤的方式大约需要matCol * matRow * k * k
次操作,其中k
是模糊内核的宽度。虽然在k=3
时这是可以的,但很快就会变得太慢。
使其更快的一种简单方法是首先仅水平模糊图像,然后垂直模糊中间结果。这将采用2 * matCol * matRow * k
运算的顺序,并给出相同的结果(以避免舍入,在整个过程的中途不要除k
- 保持中间像素总和)
如果你想要一个有趣的谜题,有一种巧妙的方法可以做到这一点,大约需要同时,无论给定的k
。