1.读取像素
灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。
灰度图像:返回值 = 图像(位置参数)
eg: test=img[88,42]
彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
import cv2 as cv
img=cv.imread("D:/ptext/girl.jpg")
test=img[100,100]
print(test)
img[100,100]=[255,255,255] #会发现,[100,100]处出现一个白点像素
print(test)
blue=img[100,100,0]
print(blue)
green=img[100,100,1]
print(green)
red=img[100,100,2]
print(red)
cv.namedWindow("Image")
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()
输出的结果为:
[ 20 45 201]
[255 255 255]
255
255
255
2.修改像素
修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。
灰度图像:
img[88,142] = 255
彩色图像:方法一
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色图像:方法二
img[88,142] = [255, 255, 255]
下面将行100到200、列100到300的像素区域设置为白色
import cv2 as cv
img=cv.imread("D:/ptext/girl.jpg")#读取图片
#将行100到200、列100到300的像素区域设置为白色
img[100:200,100:300]=[255,255,255]
cv.namedWindow("Image")#显示图像
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()
结果如下图所示:
3.Numpy读取像素
返回值 = 图像.item(位置参数)
import cv2 as cv
img=cv.imread("D:/ptext/girl.jpg")#读取图片
blue=img.item(100,100,0)
green=img.item(100,100,1)
red=img.item(100,100,2)
print(blue) #注意OpenCV读取的图像通道是BGR
print(green)
print(red)
cv.namedWindow("Image")#显示图像
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果为:
20
45
201
4.Numpy修改像素
图像.itemset(位置, 新值)
import cv2 as cv
img=cv.imread("D:/ptext/girl.jpg")#读取图片
img.itemset((100,100,0),255)
img.itemset((100,100,1),255)
img.itemset((100,100,2),0)
blue=img.item(100,100,0)
green=img.item(100,100,1)
red=img.item(100,100,2)
print(blue) #注意OpenCV读取的图像通道是BGR
print(green)
print(red)
cv.namedWindow("Image")#显示图像
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果如下所示:
255
255
0
5.行列像素的读取
cv.GetCol(im, 0): 返回第一列的像素
cv GetCols(im, 0, 10): 返回前 10 列
cv.GetRow(im, 0): 返回第一行
cv.GetRows(im, 0, 10): 返回前 10 行
这个我在试验的时候发现:AttributeError: module ‘cv2.cv2’ has no attribute ‘GetCol’
6.批量处理——通过for循环迭代处理
import cv2 as cv
import random
img=cv.imread("D:/ptext/girl.jpg")#读取图片
sp=img.shape#图像矩阵的shape属性表示图像的大小,shape会返回tuple元组,第一个元素表示矩阵行数,第二个元组表示矩阵列数,第三个元素是3,表示像素值由光的三原色组成。
height=sp[0]
width=sp[1]
for i in range(height):
for j in range(width):
if i%2==0 and j%2==1:#假如我们把行是偶数列是奇数的像素随机取一个值
img[i,j]=[random.randrange(256),random.randrange(256),random.randrange(256)]
cv.namedWindow("Image")#显示图像
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()
7.批量处理——通过LineIterator进行迭代处理
import cv2.cv as cv
im = cv.LoadImage(“img/lena.jpg”)
li = cv.InitLineIterator(im, (0, 0), (im.rows, im.cols)) #So loop the entire matrix
for (r, g, b) in li:
# 这里可以对每个像素点的 r g b 进行处理
这个我在试验时发现:AttributeError: module ‘cv2.cv2’ has no attribute ‘InitLineIterator’