【opencv】imread 赋值 深拷贝浅拷贝

import cv2
import copy
import os


def filter_srcimg(dstimg):
    ss=3
    srcimg=copy.deepcopy(dstimg)
    #aa=5
    imgw=srcimg.shape[0]
    imgh=srcimg.shape[1]
    border_mat=[[0]*imgw]*imgh
    for ddd in range(0,1):
        for i in range(20,imgw-20):
            for j in range(20,imgh-20):
                loss=(8*float(srcimg[i][j][0])-float(srcimg[i-ss][j-ss][0])-float(srcimg[i-ss][j][0])-float(srcimg[i][j-ss][0])-float(srcimg[i-ss][j+ss][0])-float(srcimg[i+ss][j-ss][0])-float(srcimg[i][j+ss][0])-float(srcimg[i+ss][j][0])-float(srcimg[i+ss][j+ss][0]))/8
                if loss>10 or srcimg[i][j][0]>180:
                    #print loss
                    #print "####,",srcimg[i][j][0]
                    border_mat[i][j]=1
                    #res=int((float(srcimg[i-aa][j-aa][0])+float(srcimg[i-aa][j][0])+float(srcimg[i][j-aa][0]))/3)
                    res=int(float(srcimg[i][j][0])-loss*3)
                    if res<0:
                        res=0
                    dstimg[i][j][0]=res
                    dstimg[i][j][1]=dstimg[i][j][0]
                    dstimg[i][j][2]=dstimg[i][j][0]
        #return dstimg


if __name__=='__main__':
    for elem in os.listdir(os.getcwd()):
        if '.py' not in elem:
            img=cv2.imread(elem)

            cv2.imshow("1",img)
            cv2.waitKey(0)
    
            filter_srcimg(img)
            cv2.imshow("1",img)
            cv2.waitKey(0)

注意事项:

1、cv2.imread返回类型

img=cv2.imread("ddd.png")

返回一个(高度,宽度,通道数)的ndarray

返回的ndarray中的数据类型是numpy.uint8,即8位无符号整数(0-255)

修改像素值:

img[0][0][0]=100

这里注意,因为ndarray中的类型为uint8,故赋的值上溢出(>255)或下溢出(<0)时,会自动取模,而不会报错!

2、深拷贝浅拷贝

(1)赋值时

对基本数据类型是值拷贝

对类是浅拷贝

如果对类进行值拷贝,需要使用深拷贝copy.deepcopy()

比较两个引用是否指向同一对象——用id()查看引用指向的地址,id()返回值为int

 

(2)函数传参时

与赋值时相同

对基本数据类型是值拷贝

 

输出是1 

对类是浅拷贝

  

输出是[2,1,1]

猜你喜欢

转载自www.cnblogs.com/zealousness/p/10088393.html