【问题标题】:I am getting black Laplacian of Guassian image我得到高斯图像的黑色拉普拉斯算子
【发布时间】:2019-09-14 04:09:10
【问题描述】:
import cv2
import math

高斯函数

def gaussianblur(img,sigma):
      if(sigma<0):
        print("SIGMA SHOULD BE POSITIVE")
        return;

用 g(x)=(1/squareroot(2*sigma*sigma*3.142)) * e^(-(x*x)/(2*sigma*sigma)) 计算一维核

      deno=(((math.sqrt(2*3.142*sigma*sigma))))
      k=[0,0,0,0,0]
      sum=0




      for x in range(-2,3):
       numo=(math.exp(-((x*x)/(2*(sigma*sigma)))))
       k[x+2]=(numo/deno)
       sum=sum+k[x+2]




      for x in range(0,5):
        k[x]=(k[x]/sum)

逐行应用卷积

      for i in range(0,img.shape[0]):
       for j in range(2,img.shape[1]-2):
            img[i,j]=abs((img[i,j-2]*k[0])+(img[i,j-1]*k[1])+(img[i,j]*k[2])+(img[i,j+1]*k[3])+(img[i,j+2]*k[4]))



      return img;  `#end of gaussian blur function`

主函数启动

读取图片

dog=img = cv2.imread('art.jpg',cv2.IMREAD_GRAYSCALE)

应用第一次模糊

temp=img=gaussianblur(img,1)

#display image
cv2.imshow('blur1',img)

应用第二次模糊

temp=gaussianblur(temp,1)

cv2.imshow('blur2',temp)

高斯的差异

for i in range(0,img.shape[0]):
    for j in range(0,img.shape[1]):
       dog[i,j]=abs((img[i,j])-(temp[i,j]))

cv2.imshow('DoG',dog)

输出

blur1

blur2

DoG

【问题讨论】:

  • 其实我想实现没有内置函数的高斯模糊。
  • 在显示图像之前尝试调用normalize(),以防数值越来越小。

标签: python image-processing filtering laplacianofgaussian


【解决方案1】:

您正在这里覆盖您的输入:

for i in range(0,img.shape[0]):
    for j in range(2,img.shape[1]-2):
        img[i,j]=abs((img[i,j-2]*k[0])+(img[i,j-1]*k[1])+(img[i,j]*k[2])+(img[i,j+1]*k[3])+(img[i,j+2]*k[4]))

尝试将结果写入新图像。

我不知道 OpenCV python 接口是如何工作的,temp=img 是否会导致 tempimg 共享数据(例如,当您更改一个时,您也会更改另一个)?确保你有两个不同的数据块!

【讨论】:

  • temp = np.zeros((img.shape[0],img.shape[1],1), np.uint8) 创建与原始图像尺寸相同的新空图像。
  • 我得到了结果,这很有帮助,谢谢@Cris Luengo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多