【问题标题】:histogram equalization for colored image give error using python opencv彩色图像的直方图均衡使用python opencv给出错误
【发布时间】:2014-04-16 07:48:06
【问题描述】:

错误:合并中的断言失败 (0

在合并函数中

cv2.merge(channels,img2)

如果参数被替换为:

cv2.merge(img2,channels)

它不会出错,但均衡前后的直方图是一样的。我可以在这段代码中做什么。

代码:

import cv2,cv
import cv2.cv as cv
import numpy as np
from matplotlib import pyplot as plt

capture = cv.CaptureFromCAM(0)
img = cv.QueryFrame(capture)
img_size = cv.GetSize(img)

width,height = img_size
size = width,height,3
channels = np.zeros(size , np.uint8) 


while (1):
img = cv.QueryFrame(capture)
img = np.asarray(img[:,:])

cv2.imshow("original",img)
hist = cv2.calcHist([img],[2],None,[256],[0,256])

#convert img to YCR_CB
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)

#split image to Y, CR, CB
cv2.split(img2,channels)

#histogram equalization to Y-MATRIX
cv2.equalizeHist(channels[0],channels[0])

#merge this matrix to reconstruct our colored image
cv2.merge(channels,img2)

#convert this output image to rgb
rgb = cv2.cvtColor(img2,cv2.COLOR_YCR_CB2BGR)
hist2 = cv2.calcHist([rgb],[2],None,[256],[0,256])
plt.plot(hist)
plt.plot(hist2)
plt.show()

【问题讨论】:

    标签: python python-2.7 opencv


    【解决方案1】:

    不要使用 splitmerge,而是利用 numpy 切片。

    img2[:, :, 0] = cv2.equalizeHist(img2[:, :, 0]) 
    # or run a small loop over each channel
    

    【讨论】:

    • 这与问题完全无关。
    • 这是实际的解决方案,你只是看不到它。
    【解决方案2】:

    你在这里弄错了 split() 。它返回频道。

    由于您没有捕获返回值,因此您的频道未初始化

    >>> import cv2
    >>> help(cv2.split)
    Help on built-in function split in module cv2:
    
    split(...)
        split(m[, mv]) -> mv
    

    所以它应该看起来像:

    channels = cv2.split(img2)
    

    避免旧的 cv api,而是始终坚持使用 cv2。 (使用 cv2.VideoCapture,而不是 cv.CaptureFromCAM)

    【讨论】:

    • berak:这可能是一个不恰当的评论,但实际上我正在尝试学习基于 python 的 opencv,我无法区分 old cv api 和新的...请告诉我,如何在查看 opencv 文档中方法的详细信息时知道哪个是新的...顺便说一句,我也是 python 新手
    • 一点也不合适。 cv2 是新的 api(建立在 opencv 的 c++ api 上,并使用 numpy 数组存储图像等), cv 是旧的(建立在 opencv 已弃用的 c-api 上)。两者本质上是不兼容的,旧的将来不会可用,所以使用cv2。怎么知道?嗯,我猜是前缀?
    • @berak:好的,谢谢。我想我明白了你的意思...我们可以通过查看它是 cv2 还是 cv 来区分。
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多