图片的属性和数组的操作

本文介绍如何使用Python的OpenCV库处理图像,包括访问像素、创建图像及使用NumPy进行数组操作。通过具体代码示例展示了图像的反转、创建及显示过程,并详细解释了range()和NumPy数组创建函数的使用。
import cv2 as cv
import numpy as np

def access_pixels(image):
    print(image.shape)
    width=image.shape[1]#将长宽 通道数 存入一个数组
    height=image.shape[0]
    channels=image.shape[2]
    print("width:%s/n,height:%s/n,channels:%s/n"%(width,height,channels))
    for row in range(height):
        for col in range(width):
            for c in range(channels):
                pv=image[row,col,c]
                image[row,col,c]=255-pv
    cv.imshow("pixels_demo",image)
    """
    上面的函数定义是将图片的长宽 通道 显示出来 然后利用迭代 range()函数 将每一个
    参数用迭代函数记录下来 然后赋给pv 这样可以得到一个原图片 然后用 255-pv可以得到
    一个反图像
    """



def create_image():
    # img=np.zeros([400,400,3],np.uint8)#创建指定大小的数组,数组元素以 0 来填充:
    # img[ : ,: ,2]=np.ones([400,400,])*255#创建指定形状的数组,数组元素以 1 来填充:
    # cv.imshow("new image",img)
    img=np.ones([400,400,1],np.uint8)#创建一个单通道图像,只有灰度关系
    #img[ : ,:,0]=np.ones([400,400])*127#
    img=img*127#0是黑色 255是白色
    cv.imshow("new image",img)



src = cv.imread("D:/image flie/1.png")#读取图片 RGB图像
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)#给窗口命名以及全尺寸窗口
cv.imshow("input image",src)#显示图片
time1=cv.getTickCount()#读取CPU始终 算是access_pixels()经历的时间
access_pixels(src)
time2=cv.getTickCount()
time=((time2-time1)/cv.getTickFrequency())
print("time : %s ms"%(time*1000))#微秒*1000就是毫秒 想得到秒乘一万就行
create_image()
cv.waitKey(0)#无限等待
cv.destroyAllWindows()

处理图片实质就是处理一个矩阵,所以学习数组很重要,对数组,数列进行各种操作。

Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。

Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。

Python2 range() 函数返回的是列表。

>>>range(5)
range(0, 5)
>>> for i in range(5):
...     print(i)
... 
0
1
2
3
4
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(0))
[]
>>>

有两个参数或三个参数的情况(第二种构造方法)::

>>>list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 2))
[0, 2, 4, 6, 8]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(1, 0))
[]
>>>
>>>

numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)

输出结果为:

[[ 6917529027641081856  5764616291768666155]
 [ 6917529027641081859 -5764598754299804209]
 [          4497473538      844429428932120]]

numpy.zeros

创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = ‘C’)

import numpy as np
 
# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

输出结果为:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]

numpy.ones

创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = ‘C’)

import numpy as np
 
# 默认为浮点数
x = np.ones(5) 
print(x)
 
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)

输出结果为:

[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]
`

``

[里面有phthon各种函数的解释 很实用](https://www.runoob.com/numpy/numpy-array-creation.html)
### 数组处理图片的技术内容 在现代编程领域,数组图像处理密切相关。以下是关于如何利用数组技术库来实现高效图像处理的相关信息。 #### 使用 NumPy 处理数组 NumPyPython 中用于科学计算的核心库之一,特别擅长于多维数组操作。通过 NumPy 的强大功能,可以轻松加载、转换并操作图像数据。例如: ```python import numpy as np from PIL import Image # 打开一张图片并将其转换为 NumPy 数组 img = Image.open('example.jpg') array = np.array(img) # 对数组进行简单变换(如灰度化) gray_array = np.dot(array[..., :3], [0.2989, 0.5870, 0.1140]) # 将 NumPy 数组重新保存为图像 new_img = Image.fromarray(gray_array.astype(np.uint8)) new_img.save('grayscale_example.jpg') ``` 此代码片段展示了如何使用 NumPy Pillow 来读取图像文件,并对其进行简单的颜色空间转换[^1]。 --- #### 利用 OpenCV 进行高级图像处理 OpenCV 是一个广泛使用的计算机视觉库,在图像处理方面具有卓越性能。它可以方便地将图像视为二维或三维数组结构来进行各种运算。下面是一个示例,展示如何从 Python 向 C++ 传递图像数据以执行更高效的处理逻辑[^2]。 ```cpp // C++ 部分 (libc_opencv.cpp) extern "C" { void transfer_image(unsigned char* data, int rows, int cols, int channels) { // 假设这里实现了某种复杂的图像增强算法... } } ``` ```python import cv2 import ctypes lib = ctypes.CDLL('./libc_opencv.so') tmp = cv2.imread("full_finish.jpg", cv2.IMREAD_GRAYSCALE) rows, cols = tmp.shape dataptr = tmp.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)) lib.transfer_image(dataptr, rows, cols, 1) ``` 上述例子说明了跨语言调用的优势——允许开发者充分利用底层优化过的 C/C++ 函数完成耗时的任务[^2]。 --- #### JavaScript Array 方法的应用场景 尽管主要讨论的是基于 Python 的解决方案,但在某些情况下也可能需要用到客户端脚本语言如 JavaScript 来动态生成或者预览图像效果。此时熟悉 `Array` 类型的各种内置函数就显得尤为重要[^3]。 假设我们有一个像素矩阵表示的小图样,则可以通过如下方式调整它的亮度对比度等属性: ```javascript function adjustBrightness(pixels, factor) { return pixels.map(pixel => Math.min(255, pixel * factor)); } const imagePixels = new Uint8ClampedArray([/* ... */]); let brighterVersion = adjustBrightness(imagePixels, 1.5); console.log(brighterVersion); // 输出修改后的像素列表 ``` 在这里可以看到 map() 方法被用来遍历整个集合并对每一个成员应用相同的算子表达式。 --- ### 总结 无论是采用高性能数值计算工具包像 NumPy/OpenCV ,还是借助灵活易学的 Web 技术栈比如 HTML5 Canvas API 加上 ES6+ 特性支持下的现代化 JS 开发环境,都可以很好地满足不同层次需求下针对阵列形式存储的数据对象即位图资源的操作诉求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值