首页 文章

应用水平Sobel Mask将图像旋转180度

提问于
浏览
1

在我的一个个人项目中,我尝试在灰度图像上应用以下水平边缘蒙版 . 通过应用水平边缘蒙版,我试图检测图像中的水平边缘 .

[1 2 1
 0 0 0 
-1 -2 -1]

当我尝试使用上面给出的蒙版卷积我的图像矩阵时,输出图像旋转180度 . 我不确定这是预期的行为还是我做错了什么?

这是卷积的代码片段 .

def convolution(self):
    result = np.zeros((self.mat_width, self.mat_height))
    print(self.mat_width)
    print(self.mat_height)

    for i in range(0, self.mat_width-self.window_width):
        for j in range(0, self.mat_height-self.window_height):
            # deflate both mat and mask 
            # if j+self.window_height >= self.mat_height:
            #   row_index = j+self.window_height + 1
            # else:

            row_index = j+self.window_height                
            col_index = i+self.window_width 

            mat_masked = self.mat[j:row_index, i:col_index]
            # pixel position 
            index_i = i + int(self.window_width / 2) 
            index_j = j + int(self.window_height / 2) 


            prod = np.sum(mat_masked*self.mask)


            if prod >= 255:
                result[index_i, index_j] = 255
            else:
                result[index_i, index_j] = 0

    return result

原始灰度输入图像在这里 -
enter image description here

这是生成的输出 .

enter image description here

1 回答

  • 1

    写入输出时的索引是相反的 . 您正在翻转水平和垂直坐标,这实际上是转置您的图像输出,您看到的输出是转置图像的结果 .

    此外,您没有正确声明图像的输出大小 . 第一个维度跨越 the rowsheight ,而第二个维度跨越 the columnswidth . 您必须进行的第一个更改是交换输出图像的输入尺寸:

    result = np.zeros((self.mat_height, self.mat_width))
    

    其次,变量 index_i 正在水平遍历,而变量 index_j 正在垂直遍历 . 您只需翻转订单,以便正确编写结果:

    if prod >= 255:
                result[index_j, index_i] = 255
            else:
                result[index_j, index_i] = 0
    

    如果由于某种原因您不想更改顺序,请保持代码的原样,包括如何声明图像的输出尺寸并简单地返回转置的结果:

    return result.T
    

相关问题