在Python中使用浮点数切片ndarray

时间:2017-03-28 12:21:14

标签: python algorithm numpy image-processing slice

我想在Python中构建一个算法,将图像切割成n-by-n个相等的块。我知道现有的Python包可以做到这一点,但我有兴趣使用结果块的维度进行数学计算,不需要是整数值。

我已使用ndarraynumpy将我的图片输入成功转换为cv2。我很好奇,如果我能够以某种方式切割ndarray对象,这样当我分割“像素”时,我只需将“像素”贡献的加权平均值加到它们各自的块上。

例如,如果图像输入的尺寸为100px x 100px,并且我想将此图像拆分为7x7块,则由于100/7 = ~14.2857,每个块的尺寸为14.2857 x 14.2857。但是拥有一小部分像素是没有意义的。相反,我希望解释这一点,以便第一个块包含像素(1,1),(1,2),...,(1,14),(2,1),...的所有信息。 ,(3,1),...,(14,1),...,(14,14),所有像素满足(15,k)和(k,15)的0.2857,像素为0.2857 * 0.2857 (15,15)。我想为所有49个街区做这件事。

任何见解都将不胜感激!感谢。

1 个答案:

答案 0 :(得分:1)

正如您所正确观察到的,图像中不能有14.29像素。但是,您可以执行下采样至14(或更少)像素或上采样至15(或更多)像素。我认为前者是你想要的,但后者也是一个可行的选择。

一种简单的方法是将图像调整为可以轻松拆分为7x7的新尺寸。如果您使用正确的函数执行此操作(例如scipy.ndimage.interpolation.zoom),它将自动插值像素值。

为简单起见,我们假设您要将5x5图像拆分为2x2块:

mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setCamera(camera);
mediaRecorder.setOrientationHint(270);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(videoQuality));

请注意,在缩放图像中,第一行中的第二个像素的值为14,其中包含来自neigbors 10和20的贡献。(它可能包含来自其他像素的贡献,因为缩放默认使用3阶样条用于插值)。图像中间的其他像素包含整个周围邻居的贡献。