Python图像处理学习记录

Python中的list和numpy中的array的区别

  • python中的list和numpy中的array是完全不一样的两个东西,list可以存放不同类型的数据,比如int、float和str,甚至布尔型;而一个numpy数组中存放的数据类型必须全部相同,例如int或float。

  • 在list中的数据类型保存的是数据的存放的地址,即指针而非数据(底层是C语言,这样想想也很正常),例如a=[1,2,3,4]需要4个指针和四个数据,增加了存储和消耗cpu,而a=np.array([1,2,3,4])只需要存放四个数据,读取和计算更加方便。

  • 所以列表List可以存放不同类型的数据,因此列表中每个元素的大小可以相同,也可以不同,所以也就不支持一次性读取一列。即使是对于标准的二维数字列表([[1,2,3,4]]这种),所以纯数字的我们最好都使用numpy的数据类型去操作。

  • 多维的list和array的访问方法也不尽相同,list仅支持a[0][0]的访问方式,numpy的array支持a[0][0]和a[0,0]两种访问方式。

#List的访问方法
a = [[1,2,'list'],[4,5,6]]
print(a[0][2])
#numpy.array的访问方法
import numpy as np
b = np.array([[1,2,3],[4,5,6]], np.uint8)
print(b[0][0])
print(b[0,0])

Python的取余运算

取余运算并不复杂,例如 23 % 5 = 3,但是对于含有负数的取余运算有时候会会让人摸不着头脑,例如 -23 % 5 = ?,23 % -5 = ?, -23 % -5 = ?。实际上取余运算与计算机的除法取整方法有密切关系,计算机上有几种对除法结果取整的方法:

  • 向上取整,向+∞方向取最接近精确值的整数,也就是取比实际结果稍大的最小整数,也叫 Ceiling 取整。这种取整方式下,17 / 10 == 2,5 / 2 == 3, -9 / 4 == -2。
  • 向下取整,向-∞方向取最接近精确值的整数,也就是取比实际结果稍小的最大整数,也叫 Floor 取整。这种取整方式下,17 / 10 == 1,5 / 2 == 2, -9 / 4 == -3。
  • 向零取整,向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整(Truncate)。这种取整方式下,17 / 10 == 1,5 / 2 == 2, -9 / 4 == -2。

Python 的除法结果取整方法是向下取整,即 Floor 取整。 可以使用地板除//检验。
Python的取余运算的具体计算方法为:__ x%y = x - (x//y)*y __,以下为一段检验Python的取余运算方法的代码:

def remainder(x, y):
   return (x - (x//y)*y)

x, y = -100, 13
print(x % y, remainder(x, y))

RGB图像的数据分析

使用图像为5x6像素的彩色图像:
在这里插入图片描述
放大后图象:
图片名称
由图中可见,第1行到第5行像素的颜色依次为黑、红、绿、蓝、白,读出图片的数据并打印出来。分析可知:

  1. 该彩色图像数据为5x6x3的三维数组img,数据类型为uint8;
  2. 每一个像素为一个1x3的矩阵对应红绿蓝RGB三原色,其中第一个元素为蓝色B、第二个元素为绿色G、第一个元素为红色R;
  3. img[0,:,:]对应第一行像素,img[:,0,:]对应第一列像素,img[:,:,0]对应每个像素的蓝色分量,其他类推。

代码:

import cv2

img = cv2.imread("img\\bmp5_6.bmp",cv2.IMREAD_COLOR)
print('图像数据:\n', img)
print('数据结构', img.shape)
print('数据类型', img.dtype)
print('第一行数据\n', img[0,:,:])
print('第一列数据\n', img[:,0,:])
print('图像的蓝色分量\n', img[:,:,0])
cv2.imshow("bmp5_6.bmp", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

图像数据:
 [[[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]

 [[  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]]

 [[  0 255   0]
  [  0 255   0]
  [  0 255   0]
  [  0 255   0]
  [  0 255   0]
  [  0 255   0]]

 [[255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]]
数据结构 (5, 6, 3)
数据类型 uint8
第一行数据
 [[0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
第一列数据
 [[  0   0   0]
 [  0   0 255]
 [  0 255   0]
 [255   0   0]
 [255 255 255]]
图像的蓝色分量
 [[  0   0   0   0   0   0]
 [  0   0   0   0   0   0]
 [  0   0   0   0   0   0]
 [255 255 255 255 255 255]
 [255 255 255 255 255 255]]

图像缩放最近邻法插值的Python实现

图像缩放最邻近法插值的原理:

  1. 原图像坐标(x,y), 缩放后图像坐标(X,Y)
  2. 缩放比例为scale[0,1],(X,Y)和 (x,y)满足如下关系:
    X = x * scale[0], 即 x = X / scale[0]
    Y = y * scale[1], 即 y = Y / scale[1]
  3. 缩放后坐标(X,Y)的图像选取原图像坐标(X/scale[0], Y/scale[1])距离最近的点的图像—因为X/scale[0]和Y/scale[1]可能都不是整数
  4. 离(X/scale[0], Y/scale[1])距离最近的点只可能是以下四个:
    0: (int(X/scale[0]), int(Y/scale[1]))
    1: (int(X/scale[0])+1, int(Y/scale[1]))
    2: (int(X/scale[0]), int(Y/scale[1])+1)
    3: (int(X/scale[0])+1, int(Y/scale[1])+1)

依据最邻近法插值的原理编写了图像缩放最邻近法的实现函数,代码如下:


import numpy as np
import cv2
import math as m

#图像近邻法缩放
#------------------------------------------------------------------------------
#函数名称:ft_nearestScaling
#输入参数:
#   image,输入图像,数据类型:array
#   scale,缩放比例系数, 数据类型:2元素元组,(x轴缩放比例,y轴缩放比例)
#输出参数:
#   imgOut,输出图像,数据类型:array
#------------------------------------------------------------------------------
def ft_nearestScaling(image, scale):
    h, w = image.shape[:2]       
    H = int(h * scale[0])
    W = int(w * scale[1])
    if len(image.shape) == 3:
        imgOut = np.zeros((H,W,3), np.uint8)
    else:
        imgOut = np.zeros((H,W), np.uint8)
    for X in range(0, H):
        for Y in range(0, W):
            x = X / scale[0]
            y = Y / scale[1]
            x_int = int(x)
            y_int = int(y)
            dist = {
    
    }
            dist[0] = abs(x - x_int) + abs(y - y_int)
            dist[1] = abs(x - (x_int + 1)) + abs(y - y_int)
            dist[2] = abs(x - x_int) + abs(y - (y_int + 1))
            dist[3] = abs(x - (x_int + 1)) + abs(y - (y_int + 1))
            min_dist = min(dist)
            if min_dist == 0:
                imgOut[X,Y] = image[x_int, y_int]
            elif min_dist == 1:
                imgOut[X,Y] = image[x_int + 1, y_int]
            elif min_dist == 2:
                imgOut[X,Y] = image[x_int, y_int + 1]
            elif min_dist == 3:
                imgOut[X,Y] = image[x_int + 1, y_int + 1]
    return imgOut

img = cv2.imread("explorer.png", cv2.IMREAD_COLOR)
img_out = ft_nearestScaling(img, (1.35,1.3))
cv2.imshow('img', img)
cv2.imshow('img_out', img_out)

cv2.waitKey(0)
cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/family5love/article/details/117148765