图像处理学习——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]])