改善这些opencv嵌套循环

时间:2020-02-24 13:26:45

标签: python numpy opencv

我想检查11张img中的每个像素,消除极值,并使用中心值来计算平均值。

    import cv2  
    import numpy as np

    img1 = cv2.imread("J:/1.jpg", cv2.IMREAD_COLOR)
    img2 = cv2.imread("J:/2.jpg", cv2.IMREAD_COLOR)
    img3 = cv2.imread("J:/3.jpg", cv2.IMREAD_COLOR)
    img4 = cv2.imread("J:/4.jpg", cv2.IMREAD_COLOR)
    img5 = cv2.imread("J:/5.jpg", cv2.IMREAD_COLOR)
    img6 = cv2.imread("J:/6.jpg", cv2.IMREAD_COLOR)
    img7 = cv2.imread("J:/7.jpg", cv2.IMREAD_COLOR)
    img8 = cv2.imread("J:/8.jpg", cv2.IMREAD_COLOR)
    img9 = cv2.imread("J:/9.jpg", cv2.IMREAD_COLOR)
    img10 = cv2.imread("J:/10.jpg", cv2.IMREAD_COLOR)
    img11 = cv2.imread("J:/11.jpg", cv2.IMREAD_COLOR)
    imgList = [img1, img2, img3, img4, img5, img6, img7, img8, img9, img10, img11]  

    height = img1.shape[0]
    width = img1.shape[1]
    imgall = np.array(imgList)

    png = np.zeros((height, width, 4), dtype=np.uint8)

    start1 = cv2.getTickCount()
    for yh in range(height):
        for xw in range(width):
            pstd = np.std(imgall[:, yh, xw, :], axis=0)
            pstdmean = np.mean(pstd)
            if pstdmean < 50:
                if pstdmean < 10:
                    png[yh, xw] = list(np.mean(imgall[:, yh, xw, :], axis=0)) + [255]
                else:
                    pmedian = np.median(imgall[:, yh, xw, :], axis=0)
                    png[yh, xw] = list(pmedian) + [255]
    end1 = cv2.getTickCount()
    during1 = (end1 - start1) / cv2.getTickFrequency()
    print(during1)

我正试图找到如何获取“聚集数” /“模式数”,例如:直方图,欧氏距离,bgr2grey,正态分布...

我想替换这种差的中位数方法。

1 个答案:

答案 0 :(得分:0)

没有人回答我,但幸运的是,我自己找到了答案。 必须将其转换为numpy计算,并且不应使用for嵌套循环。 我将bgr拆分为b [] g [] r [],这样它们就可以一一计算,并且易于理解。 然后我将这11张img堆栈(axis = -1)到每个通道,很容易理解和计算,最后我将bgr堆栈到一张img,并使用mask = cv2.inRange(xxx,a,b)帮助我获得我want.png的Alpha通道也是使用遮罩。 png = np.stack((b,g,r,mask),axis = -1)