CTF misc常用的圖像處理


一、Pillow

#基本操作
from PIL import Image  #引用Image類
im = Image.new('RGB',(110,80))  #新建圖片
im = Image.open('x.jpg')  #加載圖片
print(im.format,im.size,im.mode)  #format-格式,size-(寬&高),mode-模式
im.show()  #呈現圖片
im.getcolors()  #獲取圖片信息,一般會返回一個元組(count,(r,g,b))。該元組第一個元素count 代表該顏色像素出現的次數,第二個元素表示(rgb)。
im.convert('RGB').getpixel((0,0))  #獲取像素點的RGB值
Image.save('y.png')  #保存文件

#圖片剪切
#box是一個4元的坐標數組,坐標軸是左上角是(0,0)的卡迪爾坐標系。假設box是(x1,y1,x2,y2),則所取區域是以各自坐標划線所圍的區域。
im = Image.open('x.jpg')
box = (150,150,245,280)
region = im.crop(box)
region.show()

#圖片粘貼
#將一張圖覆蓋到另一張圖上面。格式為:paste(要貼的圖片,要貼的圖片的4元坐標組成的區域)。
im = Image.open('x.jpg')
box = (50,50,200,200)
region = im.crop(box)
# 將圖片逆序旋轉180后,黏貼到原來復制的位置 
region = region.transpose(Image.ROTATE_180)
im.paste(region,box)
im.show()

#圖像序列
#當處理GIF這種包含多個幀的圖片,稱之為序列文件,PIL會自動打開序列文件的第一幀。而使用seek和tell方法可以在不同幀移動。tell是幀數,而seek是取當前幀數的圖片。
from PIL import Image
im = Image.open("laopo.gif")
im.seek(1)
im.show()
try:
	while 1:
	im.seek(im.tell()+1)
	im.show()
except EOFError:
	pass

#讀取/修改像素
from PIL import Image
img = Image.open('x.jpg')
width , height = img.size
for i in range(0,width):
	for j in range(0,height):
		tmp = img.getpixel((i,j))
		img.putpixel((i,j),(0,0,tmp[2]))
img.show()

使用Pillow來進行圖像處理

二、OpenCV2

#圖像讀入
import cv2
img = cv2.imread(r'x.jpg',0)
#圖像顯示
cv2.imshow('tupian',img)
cv2.waitKey()
#圖像保存
cv2.imwrite('tupian,jpg',img)

#圖像屬性
print(img.shape)   #shape 返回圖像行數、列數、通道數
print(img.size)    #size 返回圖像像素數
print(img.dtype)   #dtype 返回圖像的數據類型

#通道拆分/合並
#拆分為B、G、R三個通道
#索引拆分
B = img[:,:,0]
G = img[:,:,1]
R = img[:,:,2]
#函數拆分
B,G,R = cv2.split(img)
#合並
bgr = cv2.merge([b,g,r])

#類型轉換
#將BGR模式轉換為灰度圖像,再將灰度圖像轉換為RGB模式
import cv2
import numpy as np
bgr=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)  #生成2×4×3的BGR圖像
gray=cv2.cvtColor(bgr,cv2.COLOR_BGR2GRAY)   #BGR圖像轉換為灰度圖像
rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)   #灰度圖像轉換為RGB圖像
print('bgr=\n',bgr)
print('gray=\n',gray)
print('rgb=\n',rgb)
# 在RGB色彩空間的基礎上,還可以加一個A通道,叫做Alpha通道,此時原圖像類型轉變為RGBA模式,例如常見的PNG類型圖像就是RGBA色彩空間的。
#分析alpha通道的值
import cv2
import numpy as np
img=np.random.randint(0,256,size=[2,3,3],dtype=np.uint8)  #生成2×3×3的BGR圖像
bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
print('img=\n',img)
print('bgra=\n',bgra)
b,g,r,a=cv2.split(bgra)
print('a=\n',a)
a[:,:]=125
bgra=cv2.merge([b,g,r,a])
print('bgra=\n',bgra)

#傅里葉變換
img = cv2.imread(r"x.jpg",0)
# 圖像數據要轉換成float32
img_float32 = np.float32(img)
#進行傅里葉變換
dft = cv2.dft(img_float32,flags = cv2.DFT_COMPLEX_OUTPUT)
# 將低頻信息轉換至圖像中心
dft_shift = np.fft.fftshift(dft)
# 傅里葉變換后的數據是由實部虛部構成的,需要進行轉換成圖像格式才能顯示(0,255)
magnitude = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.subplot(122),plt.imshow(magnitude,cmap='gray')
plt.show()

三、Matplotlib

#顯示圖片
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

picture = mpimg.imread('x.jpg') # 讀取和代碼處於同一目錄下的圖片
plt.imshow(picture) # 顯示圖片
plt.axis('on') # 顯示坐標軸
plt.show() #因為idle是pycharm所以多一行顯示命令

#顯示RGB某個通道
lena1 = picture*[0,0,1]   # 顯示圖片的一個通道
lena2 = picture*[1,0,0]
lena3 = picture*[0,1,0]

#RGB轉灰度
def rgb2gray2(rgb):
    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2] #數組切片
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
    return gray
gray_pro = rgb2gray2(picture)
plt.imshow(gray_pro,cmap = plt.get_cmap('gray'))
plt.axis('on')  # 顯示坐標軸
plt.show()

#保存圖片
plt.savefig('xx.jpg')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM