Python PIL与Opencv处理图片_数组


这是一张图片,可以对它进行各种处理。

灰度图

1,将图像转为灰度图,PIL
import numpy as np
from PIL import Image
pic = Image.open("digit.jpg")
pic.show()
pic = pic.convert('L')
pic.show()
1,将图像转为灰度图,OpenCv
rawimg = cv2.imread("digit.jpg")
plt.title("grey scale image")
grayscaleimg = cv2.cvtColor(rawimg,cv2.COLOR_BGR2GRAY)
plt.imshow(grayscaleimg,cmap='gray')
plt.show()

将彩色图片处理为黑白图片

Python PIL与Opencv处理图片_二值化_02

二值化(反向二值化)

像素点的灰度值大于该阈值的不进行任何改变,像素点的灰度值小于该阈值的,其灰度值全部变为0。

2,将图像二值化处理,PIL
img_path="digit.jpg"
image = Image.open(img_path)
Img = image.convert('L')
limit = 200
table = []
for i in range(256):
if i < limit:
table.append(0)
else:
table.append(1)
photo = Img.point(table, '1')
photo.show()
table = []
for i in range(256):
if i < limit:
table.append(1)
else:
table.append(0)
photo = Img.point(table, '1')
photo.show()
2,将图像二值化处理,OpenCv
rawimg = cv2.imread(r"digit.jpg")
fig = plt.figure(figsize=(10,15))#创建多个子图
GrayImage=rawimg
ret, binary = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)
print("阈值:", ret)
#cv2.imshow("binary", binary)
fig.add_subplot(2,3,1)
plt.imshow(binary,cmap='gray')
ret, binary = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
print("阈值:", ret)
#cv2.imshow("binary", binary)
fig.add_subplot(2,3,2)
plt.imshow(binary,cmap='gray')
plt.show()


Python PIL与Opencv处理图片_git_03

水平垂直方向直方图

3,水平方向直方图,OpenCv
GrayImage= cv2.cvtColor(rawimg,cv2.COLOR_BGR2GRAY)
ret,image=cv2.threshold(GrayImage,130,255,cv2.THRESH_BINARY)
(h,w)=image.shape #返回高和宽
a = [0 for z in range(0, h)]
#这里统计每一行像素个数
for j in range(0,h):
for i in range(0,w):
if image[j,i]==0:
a[j]+=1
image[j,i]=255

#这里统计每一行像素个数用黑色表示
for j in range(0,h):
for i in range(0,a[j]):
image[j,i]=0
fig.add_subplot(2,3,3)
plt.imshow(image,cmap=plt.gray())
plt.show()
3,水平方向直方图,PIL(先二值化处理)
import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
import matplotlib.pyplot as plt

img_path="digit.jpg"
image=(Image.open(img_path).convert('L'))

limit = 200
table = []
for i in range(256):
if i < limit:
table.append(0)
else:
table.append(1)

image= image.point(table, '1')
image= np.array(image)
(h,w)=image.shape #返回高和宽
a = [0 for z in range(0, h)]
#这里统计每一行像素个数
num =0
for j in range(0,h):
for i in range(0,w):
if image[j,i]==0:
num+=1

a[j]+=1
image[j,i]=255

#这里统计每一行像素个数用黑色表示
for j in range(0,h):
for i in range(0,a[j]):
image[j,i]=0

image=Image.fromarray(image)
image.show()


"

Python PIL与Opencv处理图片_二值化_04

图片与矩阵转化

1,Opencv
img = Image.open(img_path)
img_array = np.asarray(img) #图片——>数组
image = np.array(image_array, np.uint8)#数组——>图片

2,PIL
image=np.array(Image.open(img_path).convert('L'))) #图片——>数组
Image.fromarray(image_array)#数组——>图片

OpenCV和PIL之间转换

from PIL import Image
import numpy as np
import cv2
img_cv=cv2.imread(img_path)
img_pil=Image.fromarray(cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB)) #opencv转为PIL
img_cv2=cv2.cvtColor(np.asarray(img_pil),cv2.COLOR_RGB2BGR)#PIL转为OpenCV
img_pil.show()

PIL,OpenCV和ndarray 数组之间转换

from PIL import Image
import numpy as np
import cv2
img_cv=cv2.imread(img_path)##opencv读取图像
img_pil=Image.open(img_path)##PIL读取图像
img_opencv_np=np.array(img_cv)#opencv转为ndarray数组
img_pil_np=np.array(img_pil)#PIL转为ndarray数组
img_pil.show()
cv2.imshow("cv",img_cv)