哪儿有做字体设计的网站娱乐网站设计多少行业
web/
2025/9/30 23:14:09/
文章来源:
哪儿有做字体设计的网站,娱乐网站设计多少行业,什么是网络工程师,亚洲高清砖码区2022幼童专栏地址#xff1a;『youcans 的图像处理学习课』 文章目录#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】3. 图像的创建与修改 文章目录【youcans 的图像处理学习课】3. 图像的创建与修改1. 图像基本知识1.1 图像颜色的分类1.2 数字图像的… 专栏地址『youcans 的图像处理学习课』 文章目录『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】3. 图像的创建与修改 文章目录【youcans 的图像处理学习课】3. 图像的创建与修改1. 图像基本知识1.1 图像颜色的分类1.2 数字图像的表示1.3 数字图像的属性2. 像素的编辑3. 图像的创建4. 图像的复制5. 图像的裁剪6. 图像的拼接7. 图像通道的拆分8. 图像通道的合并1. 图像基本知识
1.1 图像颜色的分类
按照颜色对图像进行分类可以分为二值图像、灰度图像和彩色图像。
二值图像只有黑色和白色两种颜色的图像。每个像素点可以用 0/1 表示0 表示黑色1 表示白色。灰度图像只有灰度的图像。每个像素点用 8bit 数字 [0,255] 表示灰度如0 表示纯黑255 表示纯白。彩色图像彩色图像通常采用红色R、绿色G和蓝色B三个色彩通道的组合表示。每个像素点可以用 3个 8bit 数字 [0,255] 分别表示红色、绿色和蓝色的颜色分量如(0,0,0) 表示黑色(255,255,255) 表示白色。
彩色图像可以采用不同的表达方式。OpenCV 使用 BGR 格式色彩通道按照 B/G/R 的顺序排列而 matplotlib、PyQt5、Pillow 中使用 RGB 格式色彩通道按照 R/G/B 的顺序排列的。
一些彩色图像格式还支持透明通道alpha 通道每个像素点用 8bit 数字 [0,255] 表示透明度0 表示完全透明255 表示完全不透明。
在数字图像处理中可以根据需要对图像的通道顺序进行转换或将彩色图像转换为灰度图像、二值图像。 1.2 数字图像的表示
数字图像是通过栅格排列的像素组成的在计算机中以多维数据集来表示和处理。
OpenCV 的 Python API 是基于 Numpy 来存储和处理多维数组图像的数据结构是 ndarray 多维数组。OpenCV 中对图像的任何操作本质上都是对 ndarray 多维数组的操作和运算。
OpenCV 中的二值图像和灰度图像用二维数组 (h, w) 表示数组中的每个元素表示对应一个像素的灰度每个像素的位深度为 8位。
OpenCV 中二值图像被作为特殊的灰度图像每个像素点的值为 0黑色或 255白色。
OpenCV 中的彩色图像用三维数组 (h, w, ch3) 表示数组中的每个元素对应一个像素的某种颜色分量每个像素的位深度为 24位。
OpenCV 使用 BGR 格式色彩通道顺序为 B/G/R因此 B 通道是 img[:, :, 0] G 通道是 img[:, :, 1] R 通道是 img[:, :, 2]。 1.3 数字图像的属性
OpenCV 中图像对象的数据结构是 ndarray 多维数组因此 ndarray 数组的属性和操作方法也都适用于 OpenCV 的图像对象。例如 img.ndim查看图像的维数彩色图像的维数为 3灰度图像的维数为 2。 img.shape查看图像的形状即图像栅格的行数高度、列数宽度、通道数。 img.size查看图像数组元素总数灰度图像的数组元素总数为像素数量彩色图像的数组元素总数为像素数量与通道数的乘积。
基本例程 # 1.11 图像数组的属性imgFile ../images/imgLena.tif # 读取文件的路径img1 cv2.imread(imgFile, flags1) # flags1 读取彩色图像(BGR)img2 cv2.imread(imgFile, flags0) # flags0 读取为灰度图像# cv2.imshow(Demo1, img1) # 在窗口显示图像# key cv2.waitKey(0) # 等待按键命令# 维数(ndim), 形状(shape), 元素总数(size), 元素类型(dtype)print(Ndim of img1(BGR): {}, img2(Gray): {}.format(img1.ndim, img2.ndim)) # number of rows, columns and channelsprint(Shape of img1(BGR): {}, img2(Gray): {}.format(img1.shape, img2.shape)) # number of rows, columns and channelsprint(Size of img1(BGR): {}, img2(Gray): {}.format(img1.size, img2.size)) # size rows * columns * channelsprint(Dtype of img1(BGR): {}, img2(Gray): {}.format(img1.dtype, img2.dtype)) # uint8本例程的运行结果如下
Ndim of img1(BGR): 3, img2(Gray): 2
Shape of img1(BGR): (512, 512, 3), img2(Gray): (512, 512)
Size of img1(BGR): 786432, img2(Gray): 262144
Dtype of img1(BGR): uint8, img2(Gray): uint8通过资源管理器查看彩色图像和灰度图像的属性如下图彩色图像的位深度为 24灰度图像的位深度为 8。 2. 像素的编辑
像素是构成数字图像的基本单位像素处理是图像处理的基本操作。
对像素的访问、修改可以使用 Numpy 方法直接访问数组元素。
基本例程 # 1.13 Numpy 获取和修改像素值img1 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)x, y 10, 10 # 指定像素位置 x, y# (1) 直接访问数组元素获取像素值(BGR)pxBGR img1[x,y] # 访问数组元素[x,y], 获取像素 [x,y] 的值print(x{}, y{}\nimg[x,y] {}.format(x,y,img1[x,y]))# (2) 直接访问数组元素获取像素通道的值print(img[{},{},ch]:.format(x,y))for i in range(3):print(img1[x, y, i], end ) # i0,1,2 对应 B,G,R 通道# (3) img.item() 访问数组元素获取像素通道的值print(\nimg.item({},{},ch):.format(x,y))for i in range(3):print(img1.item(x, y, i), end ) # i0,1,2 对应 B,G,R 通道# (4) 修改像素值img.itemset() 访问数组元素修改像素通道的值ch, newValue 0, 255print(\noriginal img[x,y] {}.format(img1[x,y]))img1.itemset((x, y, ch), newValue) # 将 [x,y,channel] 的值修改为 newValueprint(updated img[x,y] {}.format(img1[x,y]))本例程的运行结果如下
x10, y10img[x,y] [113 131 226]img[10,10,ch]: 113 131 226 img.item(10,10,ch): 113 131 226 original img[x,y] [113 131 226]updated img[x,y] [255 131 226]3. 图像的创建
OpenCV 中图像对象的数据结构是 ndarray 多维数组因此可以用 Numpy 创建多维数组来生成图像。特别对于空白、黑色、白色、随机等特殊图像用 Numpy 创建图像非常方便。
Numpy 可以使用 np.zeros() 等方法创建指定大小、类型的图像对象也可以使用 np.zeros_like() 等方法创建与已有图像大小、类型相同的新图像。
函数说明 numpy.empty(shape[, dtype, order]) # 返回一个指定形状和类型的空数组 numpy.zeros(shape[, dtype, order]) # 返回一个指定形状和类型的全零数组 numpy.ones(shape[, dtype, order]) # 返回一个指定形状和类型的全一数组 numpy.empty_like(img) # 返回一个与图像 img 形状和类型相同的空数组 numpy.zeros_like(img) # 返回一个与图像 img 形状和类型相同的全零数组 numpy.ones_like(img) # 返回一个与图像 img 形状和类型相同的全一数组 参数说明
shape整型元组定义返回多维数组的形状dtype数据类型定义返回多维数组的类型可选项imgndarray 多维数组表示一个灰度或彩色图像
基本例程 # 1.14 Numpy 创建图像# 创建彩色图像(RGB)# (1) 通过宽度高度值创建多维数组height, width, channels 400, 300, 3 # 行/高度, 列/宽度, 通道数imgEmpty np.empty((height, width, channels), np.uint8) # 创建空白数组imgBlack np.zeros((height, width, channels), np.uint8) # 创建黑色图像 RGB0imgWhite np.ones((height, width, channels), np.uint8) * 255 # 创建白色图像 RGB255# (2) 创建相同形状的多维数组img1 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)imgBlackLike np.zeros_like(img1) # 创建与 img1 相同形状的黑色图像imgWhiteLike np.ones_like(img1) * 255 # 创建与 img1 相同形状的白色图像# (3) 创建彩色随机图像 RGBrandomimport osrandomByteArray bytearray(os.urandom(height * width * channels))flatNumpyArray np.array(randomByteArray)imgRGBRand flatNumpyArray.reshape(height, width, channels)# (4) 创建灰度图像imgGrayWhite np.ones((height, width), np.uint8) * 255 # 创建白色图像 Gray255imgGrayBlack np.zeros((height, width), np.uint8) # 创建黑色图像 Gray0imgGrayEye np.eye(width) # 创建对角线元素为1 的单位矩阵randomByteArray bytearray(os.urandom(height*width))flatNumpyArray np.array(randomByteArray)imgGrayRand flatNumpyArray.reshape(height, width) # 创建灰度随机图像 Grayrandomprint(Shape of image: gray {}, RGB {}.format(imgGrayRand.shape, imgRGBRand.shape))cv2.imshow(DemoGray, imgGrayRand) # 在窗口显示 灰度随机图像cv2.imshow(DemoRGB, imgRGBRand) # 在窗口显示 彩色随机图像cv2.imshow(DemoBlack, imgBlack) # 在窗口显示 黑色图像key cv2.waitKey(0) # 等待按键命令本例程的运行结果如下 4. 图像的复制
使用 Numpy 的 np.copy() 函数可以进行图像的复制不能通过直接赋值进行图像的复制。
函数说明 arr numpy.copy(img) # 返回一个复制的图像 参数说明
imgndarray 多维数组表示一个灰度或彩色图像
注意事项
Python 中的 “复制” 有无拷贝、浅拷贝和深拷贝之分无拷贝相当于引用浅拷贝只是对原变量内存地址的拷贝深拷贝是对原变量ndarray数组的所有数据的拷贝。Numpy 直接赋值是无拷贝np.copy() 方法是深拷贝切片操作是特殊的浅拷贝。直接赋值得到的新图像相当于引用改变新图像的值时原图像的值也发生改变np.copy() 方法复制图像ndarray数组得到的新图像才是深拷贝改变复制图像的形状或数值原来图像并不会发生改变。
基本例程 # 1.15 图像的复制img1 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)img2 img1.copy()print(img2img1.copy(), img2 is img1?, img2 is img1)for col in range(100):for row in range(100):img2[col, row, :] 0img3 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)img4 img3print(img4img3, img4 is img3?, img4 is img3)for col in range(100):for row in range(100):img4[col, row, :] 0cv2.imshow(Demo1, img1) # 在窗口显示图像cv2.imshow(Demo2, img2) # 在窗口显示图像cv2.imshow(Demo3, img3) # 在窗口显示图像cv2.imshow(Demo4, img4) # 在窗口显示图像key cv2.waitKey(0) # 等待按键命令本例程中img4img3 直接赋值改变 img4 的数值后 img3 的数值也被改变了img2 img1.copy()改变 img2 的数值后 img1 并未发生改变。
本例程的运行结果如下使用 np.copy() 方法得到的新图像才是深拷贝。
img2img1.copy(), img2 is img1? False
img4img3, img4 is img3? True5. 图像的裁剪
用 Numpy 的切片方法可以进行图像的裁剪操作简单方便。
方法说明 retval img[y:yh, x:xw].copy() 对图像 img 裁剪并返回指定的矩阵区域图像。
参数说明
img图像数据ndarray 多维数组x, y整数像素值裁剪矩形区域左上角的坐标值w, h整数像素值裁剪矩形区域的宽度、高度返回值 retval裁剪后获得的 OpenCV 图像nparray 多维数组
注意事项
Numpy 多维数组的切片是原始数组的浅拷贝切片修改后原始数组也会改变。推荐采用 .copy() 进行深拷贝得到原始图像的副本。Numpy 数组切片当上界或下界为数组边界时可以省略如img[y:, :x] 表示高度方向从 y 至图像底部像素ymax宽度方向从图像左侧像素 0至 x。
基本例程 # 1.16 图像的裁剪img1 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)xmin, ymin, w, h 180, 190, 200, 200 # 矩形裁剪区域 (ymin:yminh, xmin:xminw) 的位置参数imgCrop img1[ymin:yminh, xmin:xminw].copy() # 切片获得裁剪后保留的图像区域cv2.imshow(DemoCrop, imgCrop) # 在窗口显示 彩色随机图像key cv2.waitKey(0) # 等待按键命令扩展例程 函数 cv2.selectROI() 可以通过鼠标选择感兴趣的矩形区域ROI。 cv2.selectROI(windowName, img, showCrosshairNone, fromCenterNone): 使用 cv2.selectROI()可以实现对 ROI 的裁剪详见例程 1.17。 # 1.17 图像的裁剪 (ROI)img1 cv2.imread(../images/imgLena.tif, flags1) # flags1 读取彩色图像(BGR)roi cv2.selectROI(img1, showCrosshairTrue, fromCenterFalse)xmin, ymin, w, h roi # 矩形裁剪区域 (ymin:yminh, xmin:xminw) 的位置参数imgROI img1[ymin:yminh, xmin:xminw].copy() # 切片获得裁剪后保留的图像区域cv2.imshow(DemoRIO, imgROI)cv2.waitKey(0)6. 图像的拼接
用 Numpy 的数组堆叠方法可以进行图像的拼接操作简单方便。
方法说明 retval numpy.hstack((img1, img2, …)) # 水平拼接 retval numpy.vstack((img1, img2, …)) # 垂直拼接 np.hstack() 按水平方向列顺序拼接 2个或多个图像图像的高度数组的行必须相同。np.vstack() 按垂直方向行顺序拼接 2个或多个图像图像的宽度数组的列必须相同。综合使用 np.hstack() 和 np.vstack() 函数可以实现图像的矩阵拼接。np.hstack() 和 np.vstack() 只是简单地将几张图像直接堆叠而连成一张图像并未对图像进行特征提取和边缘处理因而并不能实现图像的全景拼接。
参数说明
img1, img2, …拼接前的图像ndarray 多维数组返回值 retval拼接后的图像ndarray 多维数组
基本例程 # 1.18 图像拼接img1 cv2.imread(../images/imgLena.tif) # 读取彩色图像(BGR)img2 cv2.imread(../images/logoCV.png) # 读取彩色图像(BGR)img1 cv2.resize(img1, (400, 400))img2 cv2.resize(img2, (300, 400))img3 cv2.resize(img2, (400, 300))imgStackH np.hstack((img1, img2)) # 高度相同图像可以横向水平拼接imgStackV np.vstack((img1, img3)) # 宽度相同图像可以纵向垂直拼接print(Horizontal stack:\nShape of img1, img2 and imgStackH: , img1.shape, img2.shape, imgStackH.shape)print(Vertical stack:\nShape of img1, img3 and imgStackV: , img1.shape, img3.shape, imgStackV.shape)cv2.imshow(DemoStackH, imgStackH) # 在窗口显示图像 imgStackHcv2.imshow(DemoStackV, imgStackV) # 在窗口显示图像 imgStackVkey cv2.waitKey(0) # 等待按键命令本例程的运行结果如下
Horizontal stack:
Shape of img1, img2 and imgStackH: (400, 400, 3) (400, 300, 3) (400, 700, 3)
Vertical stack:
Shape of img1, img3 and imgStackV: (400, 400, 3) (300, 400, 3) (700, 400, 3)7. 图像通道的拆分
函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。
函数说明 cv2.split(img[, mv]) - retval # 图像拆分为 BGR 通道 函数 cv2.split() 传入一个图像数组并将图像拆分为 B/G/R 三个通道。
参数说明
img图像数据ndarray 多维数组mv指定的分拆通道可选
注意事项
对于 openCV 使用的 BGR 格式图像返回的分拆通道的次序为 B、G、R 通道。BGR 彩色图像的数据形状为 (width, height, channels3)返回的 B/G/R 通道的数据形状为 (width, height)不能按照 BGR 彩色图像直接显示。如果直接用 imshow 显示返回的单通道对象将被视为 (width, height) 形状的灰度图像显示。如果要正确显示某一颜色分量需要增加另外两个通道值置 0转换为 BGR 三通道格式再用 imshow 才能显示为拆分通道的颜色。cv2.split() 操作复杂耗时可以直接使用 NumPy 切片得到分离通道。
基本例程 # 1.19 图像拆分通道img1 cv2.imread(../images/imgB1.jpg, flags1) # flags1 读取彩色图像(BGR)cv2.imshow(BGR, img1) # BGR 图像# BGR 通道拆分bImg, gImg, rImg cv2.split(img1) # 拆分为 BGR 独立通道cv2.imshow(rImg, rImg) # 直接显示红色分量 rImg 显示为灰度图像# 将单通道扩展为三通道imgZeros np.zeros_like(img1) # 创建与 img1 相同形状的黑色图像imgZeros[:,:,2] rImg # 在黑色图像模板添加红色分量 rImgcv2.imshow(channel R, imgZeros) # 扩展为 BGR 通道print(img1.shape, rImg.shape, imgZeros.shape)cv2.waitKey(0)cv2.destroyAllWindows() # 释放所有窗口本例程的运行结果如下
(512, 512, 3) (512, 512) (512, 512, 3)运行结果表明
彩色图像 img1 的形状为 (512, 512, 3)拆分的 R 通道 rImg 的形状为 (512, 512)。用 imshow 显示 rImg将被视为 (512, 512) 形状的灰度图像显示不能显示为红色通道。对 rImg 增加 B、G 两个通道值置 0转换为 BGR格式再用 imshow 才能显示红色通道的颜色。 扩展例程 使用 NumPy 切片得到分离通道更为简便而且运行速度比 cv2.split 更快。 # 1.20 图像拆分通道 (Numpy切片)img1 cv2.imread(../images/imgB1.jpg, flags1) # flags1 读取彩色图像(BGR)# 获取 B 通道bImg img1.copy() # 获取 BGRbImg[:, :, 1] 0 # G0bImg[:, :, 2] 0 # R0# 获取 G 通道gImg img1.copy() # 获取 BGRgImg[:, :, 0] 0 # B0gImg[:, :, 2] 0 # R0# 获取 R 通道rImg img1.copy() # 获取 BGRrImg[:, :, 0] 0 # B0rImg[:, :, 1] 0 # G0# 消除 B 通道grImg img1.copy() # 获取 BGRgrImg[:, :, 0] 0 # B0plt.subplot(221), plt.title(1. B channel), plt.axis(off)bImg cv2.cvtColor(bImg, cv2.COLOR_BGR2RGB) # 图片格式转换BGR(OpenCV) - RGB(PyQt5)plt.imshow(bImg) # matplotlib 显示 channel Bplt.subplot(222), plt.title(2. G channel), plt.axis(off)gImg cv2.cvtColor(gImg, cv2.COLOR_BGR2RGB)plt.imshow(gImg) # matplotlib 显示 channel Gplt.subplot(223), plt.title(3. R channel), plt.axis(off)rImg cv2.cvtColor(rImg, cv2.COLOR_BGR2RGB)plt.imshow(rImg) # matplotlib 显示 channel Rplt.subplot(224), plt.title(4. GR channel), plt.axis(off)grImg cv2.cvtColor(grImg, cv2.COLOR_BGR2RGB)plt.imshow(grImg) # matplotlib 显示 channel GRplt.show()本例程的运行结果如下GR channel 是消除 B通道保留 G/R 通道的图像 8. 图像通道的合并
函数 cv2.merge() 将 B、G、R 单通道合并为 3 通道 BGR 彩色图像。
函数说明 cv2.merge(mv[, dst]) - retval # BGR 通道合并 参数说明
mv要合并的单通道dst通道合并的图像ndarray 多维数组
注意事项
进行合并的 B、G、R 单通道图像分量数据形状必须为 (width, height)而不是形状为 (width, height, channels3) 的蓝色/绿色/红色图像。单通道图像分量的图像大小 (width, height) 必须相同才能进行合并。颜色通道要按照 B、G、R 通道次序合并才能得到 BGR 格式的合并结果。cv2.merge() 操作复杂耗时推荐使用 NumPy 数组合并函数 np.stack() 生成合成图像。
基本例程 # 1.21 图像通道的合并img1 cv2.imread(../images/imgB1.jpg, flags1) # flags1 读取彩色图像(BGR)bImg, gImg, rImg cv2.split(img1) # 拆分为 BGR 独立通道# cv2.merge 实现图像通道的合并imgMerge cv2.merge([bImg, gImg, rImg])cv2.imshow(cv2Merge, imgMerge)# Numpy 拼接实现图像通道的合并imgStack np.stack((bImg, gImg, rImg), axis2)cv2.imshow(npStack, imgStack)print(imgMerge.shape, imgStack.shape)print(imgMerge is imgStack?, np.array_equal(imgMerge, imgStack))cv2.waitKey(0)cv2.destroyAllWindows() # 释放所有窗口本例程的运行结果如下。imgMerge 与 imgStack 不仅形状相同而且每个位置的元素相等表明 cv2.merge() 与 np.stack() 方法合并图像通道的结果是相同的。
(512, 512, 3) (512, 512, 3)
imgMerge is imgStack? True【本节完】
版权声明 youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/120995650) Copyright 2022 youcans, XUPT 专栏地址『youcans 的图像处理学习课』 文章目录『youcans 的图像处理学习课 - 总目录』
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84706.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!