前言

在图像处理中有的图片较大,像素点很多,导致图像的像素矩阵维度过高,以至于计算机处理的速度较慢。

此时需要对图像的像素点进行策略性的减少,但是不能丢失图像的特征:

这里提供两个方法,1、是将图像的通过特定的卷积核将图像进行降维,例如将1000*1000的图片降维为200*200的图片。

                                 2、通过OpenCV中resize()函数对图片进行’缩放‘,该方法可以通过参数调制实现不同的缩放功能,本文针对这种方法进行图像像素矩阵的缩放。

.size()参数说明

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 

重要的参数为src,dsize,interpolation

src
dst
dsize

像素矩阵 java 像素矩阵大小_python

所以,参数dsize和参数(fx, fy)不能够同时为0

fx - 水平轴上的比例因子。当它为0时,计算公式如下:

像素矩阵 java 像素矩阵大小_像素点_02

fy - 垂直轴上的比例因子。当它为0时,计算公式如下:

像素矩阵 java 像素矩阵大小_opencv_03

 

interpolation

1)INTER_NEAREST - 最近邻插值法

2)INTER_LINEAR - 双线性插值法(默认)

3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

4)INTER_CUBIC - 基于4x4像素邻域的3次插值法

5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

实现

import cv2 as cv
import os
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np

def showImage(img):
    cv.namedWindow('img', 0)
    cv.resizeWindow('img', 600,400)
    cv.imshow("img", img)
    cv.waitKey()

img = cv.imread('D:\\dataFile\\traindata\\OCSvm\\test.jpg',1)
showImage(img)
print('原图的shape',img.size)

def changeImage(img, pra):
    #pra为缩放的倍率
    height, width = img.shape[:2]
    #此处要做integer强转,因为.resize接收的参数为形成新图像的长宽像素点个数
    size = (int(height*pra), int(width*pra))
    img_new = cv.resize(img, size, interpolation=cv.INTER_AREA)
    return img_new

showImage(changeImage(img, 0.5))
#缩放倍率为0.5,即将原图的长宽都减少一半
print('缩放后的shape',changeImage(img, 0.5).size)

 结果为:

runfile('D:/PythonFile/OneClassSVM/imgtest.py', wdir='D:/PythonFile/OneClassSVM')
原图的shape 1000000
缩放后的shape 250000

原图为:

像素矩阵 java 像素矩阵大小_像素点_04

处理之后的图为:

像素矩阵 java 像素矩阵大小_python_05

虽然图片变得模糊了一点,但是人骑着摩托车的意思还是没有变。如果让模型学习人骑着摩托车的特征,处理之后的图片还是可以hold住的,不需要高清无码的图,以便减少计算量。