像素处理与Numpy操作以及Matplotlib显示图像
1.普通操作
1.1读取像素
读取像素可以通过行坐标和列坐标来进行访问,灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。
需要注意的是, OpenCV 读取图像是 BGR 存储显示。
灰度图片读取操作:
import cv2 as cv # 灰度图像读取 gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img[20, 30]) # 显示图片 cv.imshow("gray_img", gray_img) # 等待输入 cv.waitKey() cv.destroyAllWindows()
对于读取灰度图像的像素值,只会返回相应的灰度。
彩色图像读取操作:
import cv2 as cv # 彩色图像读取 color_img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) print(color_img[20, 30]) blue = color_img[20, 30, 0] print(blue) green = color_img[20, 30, 1] print(green) red = color_img[20, 30, 2] print(red) # 显示图片 cv.imshow("color_img", color_img) # 等待输入 cv.waitKey() cv.destroyAllWindows() # 打印结果 [ 3 2 236] 3 2 236
1.2修改像素
修改像素时,直接对像素赋值新像素即可。
如果是灰度图片,直接赋值即可。
如果是彩色图片,则需依次给 BGR 三个通道的像素赋值。
import cv2 as cv # 灰度图像读取 gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img[20, 30]) # 像素赋值 gray_img[20, 30] = 255 print(gray_img[20, 30]) # 打印结果 72 255 # 彩色图像读取 color_img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) print(color_img[20, 30]) # 像素依次赋值 color_img[20, 30, 0] = 255 color_img[20, 30, 1] = 255 color_img[20, 30, 2] = 255 print(color_img[20, 30]) # 打印结果 [ 3 2 236] [255 255 255]
如果觉得依次对 BGR 三个通道赋值有些麻烦的话,也可以通过数组直接对像素点一次赋值:
# 像素一次赋值 color_img[20, 30] = [0, 0, 0] print(color_img[20, 30]) # 打印结果 [0 0 0]
下面是对一个区域的像素进行赋值,将这个区域的像素全都赋值成为白色:
import cv2 as cv color_img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) color_img[50:100, 50:100] = [255, 255, 255] cv.imshow("color_img", color_img) cv.waitKey() cv.destroyAllWindows()
2.使用Numpy操作
2.1读取像素
使用 Numpy 进行像素读取,调用方式如下:
返回值 = 图像.item(位置参数)
读取灰度图像和彩色图像如下:
import cv2 as cv # 读取灰度图像 gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img.item(20, 30)) # 打印结果 72 # 读取彩色图像 color_img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) blue = color_img.item(20, 30, 0) print(blue) green = color_img.item(20, 30, 1) print(green) red = color_img.item(20, 30, 2) print(red) # 打印结果 3 2 236
2.2修改像素
修改像素需要使用到 Numpy 的 itemset() 方法,调用方式如下:
图像.itemset(位置, 新值)
下面是我将 [20, 30] 这个修改为白色的示例:
import cv2 as cv # 读取彩色图像 color_img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) print(color_img[20, 30]) color_img.itemset((20, 30, 0), 255) color_img.itemset((20, 30, 1), 255) color_img.itemset((20, 30, 2), 255) print(color_img[20, 30]) # 输出结果 [ 3 2 236] [255 255 255]
Matplotlib显示图像
我们可以通过 OpenCV 读入图像,然后使用 Matplotlib 来进行图像显示。
import cv2 as cv from matplotlib import pyplot as plt img=cv.imread('maliao.jpg', cv.IMREAD_COLOR) plt.imshow(img) plt.show()
如果我们直接使用 Matplotlib 来显示 OpenCV 读入的图像,会得到下面这个图:
这是因为对于 OpenCV 的像素是 BGR 顺序,然而 Matplotlib 所遵循的是 RGB 顺序。
解决的方案有很多种,如下:
import cv2 as cv from matplotlib import pyplot as plt img=cv.imread('maliao.jpg',cv.IMREAD_COLOR) # method1 b,g,r=cv.split(img) img2=cv.merge([r,g,b]) plt.imshow(img2) plt.show() # method2 img3=img[:,:,::-1] plt.imshow(img3) plt.show() # method3 img4=cv.cvtColor(img, cv.COLOR_BGR2RGB) plt.imshow(img4) plt.show()