我正在尝试对图像进行Sobel手术,但是我一直得到翻转的结果。这是我一直得到的结果:
我的代码如下:
void MyMainWindow::clickButtonEdge() {
int kx[3][3] = {-1, 0 , 1, -2, 0, 2, -1, 0, 1};
int ky[3][3] = {1, 2, 1, 0, 0, 0, -1, -2, -1};
QImage img(m_image_path.c_str());
for(int y=1; y < img.height()-1; y++){
for(int x = 1; x<img.width()-1; x++){
int a = (QColor(img.pixel(x-1,y-1)).red() + QColor(img.pixel(x-1,y-1)).blue()
+ QColor(img.pixel(x-1,y-1)).green())/3;
int b = (QColor(img.pixel(x,y-1)).red() + QColor(img.pixel(x,y-1)).blue()
+ QColor(img.pixel(x,y-1)).green())/3;
int c = (QColor(img.pixel(x+1,y-1)).red() + QColor(img.pixel(x+1,y-1)).green()
+ QColor(img.pixel(x+1,y-1)).blue())/3;
int d = (QColor(img.pixel(x-1,y)).blue() + QColor(img.pixel(x-1,y)).green()
+ QColor(img.pixel(x-1,y)).red())/3;
int e = (QColor(img.pixel(x,y)).green() + QColor(img.pixel(x,y)).red() + QColor(img.pixel(x,y)).blue())/3;
int f = (QColor(img.pixel(x+1,y)).blue() + QColor(img.pixel(x+1,y)).red()
+ QColor(img.pixel(x+1,y)).green())/3;
int g = (QColor(img.pixel(x-1,y+1)).green() + QColor(img.pixel(x-1,y+1)).red()
+ QColor(img.pixel(x-1,y+1)).blue())/3;
int h = (QColor(img.pixel(x,y+1)).blue() + QColor(img.pixel(x,y+1)).green()
+ QColor(img.pixel(x,y+1)).red())/3;
int i = (QColor(img.pixel(x+1,y+1)).red() + QColor(img.pixel(x+1,y+1)).green()
+ QColor(img.pixel(x+1,y+1)).blue())/3;
int matrix[3][3] = {a,b,c,d,e,f,g,h,i};
int sumx = 0;
int sumy = 0;
for(int s=0; s<3; s++){
for(int t=0; t<3; t++){
sumx = sumx + (matrix[s][t] * kx[s][t]);
sumy = sumy + (matrix[s][t] * kx[s][t]);
}
}
int newValue = sqrt(pow(sumx, 2) + pow(sumy, 2));
if(newValue < 0){
newValue = 0;
}
if(newValue > 255){
newValue = 255;
}
QColor test = QColor(img.pixel(x,y));
test.setRed(newValue);
test.setBlue(newValue);
test.setGreen(newValue);
img.setPixel(x, y, test.rgb());
}
}
m_label_picture->setPixmap(QPixmap::fromImage(img));
}
我使用Qt和C ++
首先,我将两个内核分别命名为kx和ky。
然后我加载图像并构建一个for循环结构,该循环结构将根据我需要的像素周围的像素的灰度值(用于内核乘法)创建一个新矩阵,然后我将kx和ky。 我真的不知道我的错误, 感谢您的帮助!
答案 0 :(得分:0)
它在哪个轴上翻转?原始图像是什么?我不确定这是否可以解决问题,但是您在此行乘以错误的内核:
sumy = sumy + (matrix[s][t] * kx[s][t]);
答案 1 :(得分:0)
您正在覆盖输入图像,然后使用覆盖的值进行以后的计算, 这将导致错误的结果。
为避免这种情况,您可以复制图像并将其用作目的地。 (使用副本作为源更好,因为这样做可以减少复制, 但只需较少的代码更改就可以用作目标位置
您还同时使用kx
进行x和y计算。
QImage img(m_image_path.c_str());
QImage out = img.copy(); /* add this */
for(int y=1; y < img.height()-1; y++){
for(int x = 1; x<img.width()-1; x++){
/* omitted, same as the original code */
for(int s=0; s<3; s++){
for(int t=0; t<3; t++){
sumx = sumx + (matrix[s][t] * kx[s][t]);
sumy = sumy + (matrix[s][t] * ky[s][t]); /* use ky, not kx */
}
}
/* omitted, same as the original code */
QColor test = QColor(img.pixel(x,y));
test.setRed(newValue);
test.setBlue(newValue);
test.setGreen(newValue);
out.setPixel(x, y, test.rgb()); /* modify out, not img */
}
}
img = out; /* filter calculation is done, so update img */