十、OpenCV对一张图像做卷积运算

def conv_only():
    '''
    对输入的单张图像做卷积运算
    '''
    def ImgConvolve(image_array, kernel):
        image_arr = image_array.copy()
        # 灰度图像矩阵的维度
        img_dim1, img_dim2 = image_arr.shape
        # 过滤器的维度
        k_dim1, k_dim2 = kernel.shape
        
        # 填充时增加的高和宽度
        AddW = int((k_dim1-1)/2)
        AddH = int((k_dim2-1)/2)
        
        # padding填充
        temp = np.zeros([img_dim1 + AddW*2, img_dim2 + AddH*2])
        # 将原图拷贝到临时图片的中央,这样临时图片就是在原图的基础上padding=1的0像素的填充
        temp[AddW:AddW+img_dim1, AddH:AddH+img_dim2] = image_arr[:, :]
        # 初始化一张同样大小的输出图片
        output = np.zeros_like(a = temp)
        
        # 将扩充后的图和卷积核进行卷积
        for i in range(AddW, AddW+img_dim1):
            for j in range(AddH, AddH+img_dim2):
                # 只填充了和原图像一样大小的位置
                # (i-AddW)-(i+AddW+1) = 2*AddW + 1 = k_dim1正好为卷积核的维度
                output[i][j] = int(np.sum(temp[i-AddW:i+AddW+1, j-AddH:j+AddH+1] * kernel))
        
        return output[AddW:AddW+img_dim1, AddH:AddH+img_dim2] 
    # 提取竖直方向特征
    kernel_1 = np.array([
        [-1, 0, 1],
        [-2, 0, 2],
        [-1, 0, 1]
    ])
    
    # 提取水平方向特征
    kernel_2 = np.array([
        [-1, -2, -1],
        [0, 0, 0],
        [1, 2, 1]
    ])
    
    # Laplace扩展算子
    kernel = np.array([
        [1, 1, 1],
        [1, -8, 1],
        [1, 1, 1]
    ])
    # 打开图像并转换为灰度图像
    image = Image.open("3.jpg").convert("L")
    #image = cv2.GaussianBlur(image, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
    # 将图像转换为数组
    image_array = np.array(image)
    
    # 卷积操作
    sobel_x = ImgConvolve(image_array, kernel_1)
    
    sobel_y = ImgConvolve(image_array, kernel_2)
    laplace = ImgConvolve(image_array, kernel)
    #ret, binary = cv2.threshold(sobel_x, 150, 255, cv2.THRESH_BINARY)
    #cv2.imshow('adnd',sobel_x)
    #cv2.waitKey(0)
    
    #cv2.namedWindow('sobel_x',cv2.WINDOW_NORMAL)
    #cv2.resizeWindow('sobel_x',300,300)
    #cv2.imshow("sobel_x", sobel_x)
    #cv2.imshow("sobel_y", sobel_y)
    #cv2.imshow("laplace", laplace)
    #cv2.waitKey(0)
    
    plt.imshow(image_array,cmap=cm.gray)
    
    plt.axis("off")
    plt.show()
    
    plt.imshow(sobel_x, cmap=cm.gray)
    #print(image_array.shape)
    #cv2.imwrite('huidu2.jpg',sobel_x)
    plt.axis("off")
    plt.show()
    
    plt.imshow(sobel_y, cmap=cm.gray)
    plt.axis("off")
    plt.show()
    
    plt.imshow(laplace, cmap=cm.gray)
    plt.axis("off")
    plt.show() 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小树苗m

您的打赏,是我的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值