图像处理学习——1-读__getitem__()

1.插值:interpolation

在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。

插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。
插值:用来填充图像变换时像素之间的空隙。
img = cv2.resize(img, (self.img_size_width, self.img_size_height), interpolation = cv2.INTER_LINEAR)

2. resize函数说明

OpenCV提供了resize函数来改变图像的大小,函数原型如下:

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
 参数说明:

src:输入,原图像,即待改变大小的图像;
dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算:
       dsize = Size(round(fx*src.cols), round(fy*src.rows))

       其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。

fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;


interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
      INTER_NEAREST - 最邻近插值
      INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
      INTER_AREA -区域插值 resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
      INTER_CUBIC - 4x4像素邻域内的双立方插值
      INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

使用注意事项:

   dsize和fx/fy不能同时为0

要么你就指定好dsize的值,让fx和fy空置直接使用默认值,就像

resize(img, imgDst, Size(30,30));
要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!



3.图像格式

BMP格式
Windows系统下的标准位图格式,未经压缩,一般图像文件会比较大,在很多软件中被广泛使用;
JPEG格式
应用最广泛的图片格式之一,它采用一种特殊的有损压缩方法,达到较大的压缩比(可到2:1甚至40:1),互联网上最广泛使用的格式
GIF格式
不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式,但是其色域不太广,只支持256种颜色
PNG格式
与JPG格式类似,压缩比高于GIF,支持图像透明,支持Alpha通道调节图像的透明度;
TIFF格式
它的特点是图像格式复杂,储存信息多,在Mac中广泛使用,非常有利于原稿的复制,在很多地方将TIFF格式用于印刷;


4、图像分辨率和通道数


分辨率
单位长度中所表达或截取的像素数目,每英寸图像内的像素点数,单位是像素每英寸(PPI)。图像分辨率越高,像素的点密度越高,图像越清晰;
通道数
图像的位深度,是指描述图像中每个pixel数值所占的二进制位数位深度越大则图像能表示的颜色数就越多,色彩越丰富逼真;
8位:单通道图像,也就是灰度图,灰度值范围为2 ∗ ∗ 8 = 256 2**8=2562∗∗8=256;
24位:三通道3 ∗ 8 = 24 3*8=243∗8=24,每个通道用8比特进行存储;
32位:三通道加透明度Alpha通道

5.cv2.addWeighted函数

 

该函数的完整表述为:Python-OpenCV 图像叠加 or 图像混合加权实现。

函数原型如下:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

 参数说明:

  • src1, src2:需要融合叠加的两副图像,要求大小和通道数相等
  • alpha:src1 的权重
  • beta:src2 的权重
  • gamma:gamma 修正系数,不需要修正设置为 0
  • dst:可选参数,输出结果保存的变量,默认值为 None
  • dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如 RGB 用三个字节表示,则为 24 位),选默认值 None 表示与源图像保持一致。

返回值:融合叠加的结果图像

官方手册也给出了最终的结果:

dst = src1 × alpha + src2 × beta + gamma;

上面的式子理解为,结果图像 = 图像 1× 系数 1+图像 2× 系数 2+亮度调节量

 6.一段存疑的代码:

def __getitem__(self, index):
        img_path = self.data_list[index]
        label_path = img_path.split(".")[0] + ".txt"

        # 归一化操作
        img = cv2.imread(img_path)
        img = cv2.resize(img, (self.img_size_width, self.img_size_height), interpolation = cv2.INTER_LINEAR) 
        #数据增强
        if self.imgaug == True:
            img = img_aug(img)
        img = img.transpose(2,0,1)#?为什么要这样转置

        # 加载label文件
        if os.path.exists(label_path):
            label = []
            with open(label_path, 'r') as f:
                for line in f.readlines():
                    l = line.strip().split(" ")
                    label.append([0, l[0], l[1], l[2], l[3], l[4]])
            label = np.array(label, dtype=np.float32)

            if label.shape[0]:
                assert label.shape[1] == 6, '> 5 label columns: %s' % label_path
                #assert (label >= 0).all(), 'negative labels: %s'%label_path
                #assert (label[:, 1:] <= 1).all(), 'non-normalized or out of bounds coordinate labels: %s'%label_path
        else:
            raise Exception("%s is not exist" % label_path)  
        
        return torch.from_numpy(img), torch.from_numpy(label)

 不是很理解label这句😐

label.append([0, l[0], l[1], l[2], l[3], l[4]])
posted @ 2022-12-29 09:40  Yuxi001  阅读(45)  评论(0编辑  收藏  举报