gpt4 book ai didi

python - 分析图像中每个子窗口的更快方法?

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:14 26 4
gpt4 key购买 nike

我正在尝试计算图像中子窗口的熵特征。这是我写的代码:

  def genHist(img):
hist = np.histogram(img, np.arange(0, 256), normed=True)
return hist[0]

def calcEntropy(hist):
logs = np.nan_to_num(np.log2(hist))
hist_loghist = hist * logs
entropy = -1 * hist_loghist.sum()
return entropy

img = cv2.imread("lena.jpg", 0)
result = np.zeros(img.shape, dtype=np.float16)
h, w = img.shape
subwin_size = 5
for y in xrange(subwin_size, h-subwin_size):
for x in xrange(subwin_size, w-subwin_size):
subwin = img[y-subwin_size:y+subwin_size, x-subwin_size:x+subwin_size]
hist = genHist(subwin) # Generate histogram
entropy = calcEntropy(hist) # Calculate entropy
result[y, x] = entropy

实际上,它有效。但问题是它的速度,太慢了。你有什么想法让它变快吗?

最佳答案

您可以进行一些修改以使其更快。

您的代码在我的笔记本电脑上需要以下时间:

IPython CPU timings (estimated):
User : 50.92 s.
System : 0.01 s.
Wall time: 51.20 s.

我做了以下修改:

1 - 删除函数 genHist 并在 calcEntropy() 中实现它。它会保存,可能是 1 或 2 秒。

2 - 而不是 logs = np.nan_to_num(np.log2(hist)),我只是在找到日志之前向 hist 添加了一个小值 0.00001。 logs = np.log2(hist+0.00001)。它将节省 3-4 秒,但它会稍微改变您的输出。我得到的两个结果之间的最大误差是 0.0039062。 (所以要不要这个就看你自己了)

3 - 将 np.histogram 更改为 cv2.calcHist()它将节省超过 25 秒

现在,代码在我的笔记本电脑上花费的时间如下:

IPython CPU timings (estimated):
User : 13.38 s.
System : 0.00 s.
Wall time: 13.41 s.

速度提高了 3 倍以上。

代码:

def calcEntropy(img):
#hist,_ = np.histogram(img, np.arange(0, 256), normed=True)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist = hist.ravel()/hist.sum()
#logs = np.nan_to_num(np.log2(hist))
logs = np.log2(hist+0.00001)
#hist_loghist = hist * logs
entropy = -1 * (hist*logs).sum()
return entropy

img = cv2.imread("lena.jpg", 0)
result2 = np.zeros(img.shape, dtype=np.float16)
h, w = img.shape
subwin_size = 5
for y in xrange(subwin_size, h-subwin_size):
for x in xrange(subwin_size, w-subwin_size):
subwin = img[y-subwin_size:y+subwin_size, x-subwin_size:x+subwin_size]
#hist = genHist(subwin) # Generate histogram
entropy = calcEntropy(subwin) # Calculate entropy
result2.itemset(y,x,entropy)

现在的主要问题是两个for循环。我认为它是 Cython 实现的最佳候选者,并且会产生非常好的结果。

关于python - 分析图像中每个子窗口的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16647116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com