# import packages
from PIL import Image
from PIL import ImageFilter
import numpy as np
import numpy as np
import pandas as pd
import re
import matplotlib.pyplot as mpl
from urllib.parse import urlparse
import urllib.robotparser
# 一个check能不能fetch的方程
def canFetch(url):
parsed_uri = urlparse(url)
domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
rp = urllib.robotparser.RobotFileParser()
rp.set_url(domain + "/robots.txt")
try:
rp.read()
canFetchBool = rp.can_fetch("*", url)
except:
canFetchBool = None
return canFetchBool
这里我选择了一张曝光度不够高的图片
查看是不是能通过打开,如果能,就用urllib打开图片
url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591003793908&di=6ea0016b97fbcfe029c040421a585e33&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Ffront%2F265%2Fw640h425%2F20181002%2FeAw0-hktxqah3979676.jpg'
if canFetch(url):
image = Image.open(urllib.request.urlopen(url))
display(image)
我们将长和宽都除以4,相当于变成了原来图片1/16的大小。
sImg = image
w,h=sImg.size
dImg=sImg.resize((int(w/4),int(h/4)),Image.ANTIALIAS)
display(dImg)
首先我们要知道RGB是Red,Green,Blue红绿蓝。图片里所有的色块都是由这三个参数组成的。
我们可以将我们的图片转换成一个np.array:
print(np.array(dImg).shape)
np.array(dImg)
大概是这样
(106, 160, 3)
array([[[74, 78, 89],
[76, 80, 92],
[77, 81, 92],
...,
[70, 74, 85],
[70, 75, 86],
[72, 76, 88]],
[[70, 76, 90],
[71, 78, 92],
[72, 78, 92],
...,
[68, 74, 88],
[68, 74, 88],
[66, 73, 86]],
[[67, 77, 93],
[69, 78, 95],
[69, 79, 95],
...,
[65, 75, 91],
[64, 73, 89],
[61, 70, 87]],
...,
[[10, 14, 23],
[10, 14, 23],
[10, 14, 23],
...,
[ 3, 6, 15],
[ 5, 8, 17],
[ 5, 8, 17]],
[[ 9, 13, 22],
[ 9, 13, 22],
[ 9, 13, 22],
...,
[ 1, 4, 13],
[ 2, 5, 14],
[ 2, 5, 14]],
[[ 9, 13, 22],
[ 9, 13, 22],
[ 9, 13, 22],
...,
[ 2, 5, 14],
[ 1, 4, 13],
[ 0, 3, 12]]], dtype=uint8)
shape为(106,160,3)。
106是图片的高,160是图片的长,第三个数就是RGB的长度(都是3)
每一行的第一个数就是Red系数,越高(最高255)代表红色越多,越低(最低0)代表红色越少。
全黑是(0,0,0)
全白是(255,255,255)
正红色是(255,0,0)
绿色,蓝色同理。
在明白了这个array究竟有什么意义之后,我们来增加明亮度。
越接近255,也就越偏向白色。所以我们要做的就是增加array里每一个数值
#通过不断调试这个相乘的系数,我确定了2.5是最佳的
bright_arr = np.array(dImg)*2.5
bright_arr = bright_arr.astype('uint8')
image_bright = Image.fromarray(bright_arr)
display(image_bright)
我们可以通过将每个色块(pixel)红色的指数全部改成200.
bright_arr[:,:,0] = 200
bright_arr = bright_arr.astype('uint8')
image_red = Image.fromarray(bright_arr)
display(image_red)
当然我们可以通过自己“调色”,添加除了基础色以外的滤镜。比如我知道红加蓝等于紫色。我可以加一个紫色滤镜
bright_arr[:,:,0] = 200
bright_arr[:,:,2] = 200
bright_arr = bright_arr.astype('uint8')
image_purple = Image.fromarray(bright_arr)
display(image_purple)
PIL有很多的filter,可以百度一下都有哪些。这里我应用了模糊滤镜,将原来清晰的图片变得模糊。
blurred_image = image_purple.filter(ImageFilter.BLUR)
display(blurred_image)