一、對圖片各個像素點的像素值進行操作
image.shape[0]
:image圖像的height
image.shape[1]
:image圖像的width
image.shape[2]
:image圖像的channels
import cv2
import numpy as npdef access_pixels(image):print(image.shape)height = image.shape[0]width = image.shape[1]channels = image.shape[2]print("width:%s,height:%s,channels:%s"%(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 - pvcv2.imshow("pixels ",image)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)t1 = cv2.getTickCount()
access_pixels(src)#為了得到該代碼的運行時間,通常再這行代碼上下放入一個Tick進行計時
t2 = cv2.getTickCount()time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
運行結果為:
運行的時間為619ms時間有點長,這里也就是實現圖像像素值的反轉操作而已,這里可以調用bitwise_notAPI(這個函數是C++寫的),來縮短運行時間
cv2.bitwise_not(image)
:255 - image所對應的像素值
import cv2
import numpy as npdef inverse(image):dst = cv2.bitwise_not(image)cv2.imshow("inverse_image",dst)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
inverse(src)
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
運行效果如下:
二、創建圖像
創建一個400×400的三顏色通道的圖像,圖像的B通道賦值為1,其他顏色通道賦值為0,即顯示藍色
np.zeros([400,400,3],np.uint8)
:創建一個400*400的3顏色通道的圖像,全部賦值為0,且每個像素值單位為uint8
import cv2
import numpy as npdef create_image():img = np.zeros([400,400,3],np.uint8)img[:,:,0] = np.ones([400,400])*255cv2.imshow("new image",img)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
create_image()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下:
三、對單通道圖像進行操作
方法一:先對400×400大小的單通道圖像全部初始化為0,然后再對400×400區域的像素1乘以127,最終轉換為127像素的灰色圖像。
np.zeros([400,400,3],np.uint8)
:創建一個400400的3顏色通道的圖像,全部賦值為0,且每個像素值單位為uint8
np.ones([400,400])*127
:對400400的圖像的元素再次基礎上分別乘以127
import cv2
import numpy as npdef create_image():img = np.zeros([400,400,1],np.uint8)img[:,:,0] = np.ones([400,400])*127cv2.imshow("new image",img)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
create_image()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
運行效果如下:
方法二:直接對400×400像素大小的單通道圖像全部初始化為1,再對圖像乘以255,得到白色圖像。
img = np.ones([400,400,1],np.uint8)
:創建一個400*400的單通道的圖像,全部賦值為1,且每個像素值單位為uint8
img = img * 255
:img圖像所有的像素值均對應乘以255
import cv2
import numpy as npdef create_image():img = np.ones([400,400,1],np.uint8)img = img * 255cv2.imshow("new image",img)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
create_image()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下:
四、對矩陣操作
np.ones([3,3],np.uint8)
:創建一個3 * 3的矩陣,全部賦值為1,且每個像素值單位為uint8
m1.fill(52)
:m1圖像的所有像素點的像素值全部填充為52
m1.reshape([1,9])
:將m1原本3 * 3的矩陣轉換為1* 9的矩陣
import cv2
import numpy as npdef create_image():m1 = np.ones([3,3],np.uint8)m1.fill(52)print(m1)m2 = m1.reshape([1,9])print(m2)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
create_image()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下: