智慧团建网站链接,企业网站 设计,西安seo全网营销,网站开发的项目开发计划目录
学习目标
获取图像像素并修改像素值
获取图像属性
图像ROI
拆分及合并图像通道
图像边缘扩充 学习目标
获取像素值并修改获取图像的属性(信息)图像的ROI获取图像通道拆分及合并图像扩边
获取图像像素并修改像素值 几乎所有这些操作与Numpy 的关系要比与OpenCV 的…
目录
学习目标
获取图像像素并修改像素值
获取图像属性
图像ROI
拆分及合并图像通道
图像边缘扩充 学习目标
获取像素值并修改获取图像的属性(信息)图像的ROI获取图像通道拆分及合并图像扩边
获取图像像素并修改像素值 几乎所有这些操作与Numpy 的关系要比与OpenCV 的关系更加紧密因此熟练Numpy 可以帮助我们写出性能更好的代码。通常可以根据像素的行和列的坐标获取他的像素值。对BGR 图像而言返回值分别为B、G、R 的值。对灰度图像而言会返回他的灰度值(亮度),下面代码展示如何获取图像的像素
# 导入必要的库
import cv2
import numpy as np# 根据图片路径读入图像
imgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)# 获取某一位置三通道像素的值
pximg[100,100]
print (px)# 获取某一位置蓝色通道的值
blueimg[100,100,0]
print (blue)# 结果展示
## [57 63 68]
## 57可以使用以下方式修改像素值
img[100,100][255,255,255]
print (img[100,100])
# 结果如下
## [255 255 255] 警告:Numpy 是经过优化了的快速矩阵运算的软件包。所以我不推荐逐个获取像素值并修改这样会很慢能有矩阵运算就不要用循环。
注意上面提到的方法通常用来选取矩阵的一个区域比如图像前5行的后3列。对于获取每一个像素值也可使用Numpy 的array.item() 和array.itemset() 会更好。但是返回值是标量。如果你想获得所有B、G、R 的值你可以使用array.item() 分割他们。
获取像素值及修改的更好方法如下
import cv2
import numpy as npimgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)print (img.item(10,10,2))
img.itemset((10,10,2),100)
print (img.item(10,10,2))
## 50
## 100
获取图像属性 图像的属性值一般包括以下内容
尺寸图像的尺寸指的是图像的宽度和高度通常用像素pixel表示。例如一个图像的尺寸可以为640x480表示宽度为640像素高度为480像素。通道数彩色图像通常由红、绿、蓝三个通道组成每个通道表示一种颜色分量。灰度图像只有一个通道表示图像的亮度。通道数可以用来区分彩色图像和灰度图像。数据类型图像的像素值可以用不同的数据类型来表示例如无符号整数unsigned integer或浮点数float。常见的数据类型有8位无符号整数uint8、16位无符号整数uint16、32位浮点数float32等。像素值范围图像的像素值范围取决于数据类型例如8位无符号整数的像素值范围为0-25516位无符号整数的像素值范围为0-65535。像素值范围可以用来判断图像的亮度级别。位深度图像的位深度指的是每个像素所占用的比特数。例如8位图像的位深度为8表示每个像素由8个比特表示。位深度可以影响图像的色彩精度和灰度级别。颜色空间彩色图像可以使用不同的颜色空间来表示颜色信息常见的颜色空间有RGB、HSV、Lab等。不同的颜色空间可以表示不同的颜色分量例如RGB颜色空间使用红、绿、蓝三个分量表示颜色。 以上是图像的一些常见属性值不同的图像处理库可能会提供更多的属性信息。在进行图像处理时对这些属性值的理解和操作是非常重要的。下面介绍OpenCV中常见的图像属性处理包括:行、列、通道、图像数据类型、图像素数目等。img.shape 可以获取图像的形状。他的返回回值是一个包含行数、列数、通道数的元组。
print (img.shape)
## (280, 450, 3) 注意:如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个函数返回值就可以知道加载的 是灰度图还是彩色图。 img.size 可以返回图像的像素数目。
print (img.size)
## 378000
img.dtype 返回的是图像的数据类型.
print (img.dtype)
## uint8
注意:在除虫(debug)时img.dtype 非常重要。因为在OpenCVPython代码中经常出现数据类型的不一致。
图像ROI 有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置我们应先应先在图像中找到脸再在脸的区域中找眼睛而不是直接在一幅图像中搜索这样会提高程序的准确性和性能。ROI 也是使用Numpy 索引来获得的。现在我们选择择球的部分并把他拷贝到图像的其他区域。
import cv2
import numpy as np
imgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)
ballimg[280:340,330:390]
img[273:333,100:160]bal 拆分及合并图像通道 有时我们需要对BGR 三个通道分别进行操作。这时你就需要把BGR 拆分成单个通道。有时你需要把独立通道的图片合并成一个BGR 图像。你可以这样做
import cv2
import numpy as np
imgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)
b,g,rcv2.split(img)
imgcv2.merge(b,g,r)
或者这样
import cv2
import numpy as np
imgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)
bimg[:,:,0] 假如你想使所有像素的红色通道值都为0你不必先拆分再赋值。你可以直接使用Numpy 索引会更快。
import cv2
import numpy as np
imgcv2.imread(/home/duan/workspace/opencv/images/roi.jpg)
img[:,:,2]0 警告cv2.split() 是一个比较耗时的操作。只有真正需要时才用它能用Numpy 索引就尽量用。
图像边缘扩充 如果你想在图像周围创建一个边就像相框一样你可以使用cv2.copyMakeBorder()函数。这经常在卷积运算或0 填充时被用到。cv2.copyMakeBorder()函数是OpenCV中用于在图像周围创建边框的函数。该函数可以用于在图像的上、下、左、右四个方向上添加指定大小和类型的边框。
函数的语法如下
dst cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)参数说明
src输入图像可以是任意尺寸和通道数的图像。top顶部边框的大小以像素为单位。bottom底部边框的大小以像素为单位。left左侧边框的大小以像素为单位。right右侧边框的大小以像素为单位。borderType边框类型可以是以下值之一 cv2.BORDER_CONSTANT常数边框边框像素值为指定的value。cv2.BORDER_REPLICATE复制边框边框像素值为最边缘像素的值。cv2.BORDER_REFLECT反射边框边框像素值沿边界反射。cv2.BORDER_REFLECT_101反射边框边框像素值沿边界反射但是排除边界像素。cv2.BORDER_WRAP环绕边框边框像素值沿边界环绕。value当borderType为cv2.BORDER_CONSTANT时用于指定边框像素值的常数。
函数返回的是添加了边框的图像。为了更好的理几种类型看下的演示程序
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE[255,0,0]
img1cv2.imread(intro.png)
replicate cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,valueBLUE)
plt.subplot(231),plt.imshow(img1,gray),plt.title(ORIGINAL)
plt.subplot(232),plt.imshow(replicate,gray),plt.title(REPLICATE)
plt.subplot(233),plt.imshow(reflect,gray),plt.title(REFLECT)
plt.subplot(234),plt.imshow(reflect101,gray),plt.title(REFLECT_101)
plt.subplot(235),plt.imshow(wrap,gray),plt.title(WRAP)
plt.subplot(236),plt.imshow(constant,gray),plt.title(CONSTANT)
plt.show()