恢复更新了奥xdm
跟上一个作业差不多,主要是记住一些函数即可。
这个题教我们 g e t p i x e l getpixel getpixel和 p u t p i x e l putpixel putpixel具体用法,里面的坐标是坐标对,比如 g e t p i x e l ( x , y ) getpixel(x, y) getpixel(x,y)是错的但是 g e t p i x e l ( ( x , y ) ) getpixel((x, y)) getpixel((x,y))是对的。
from PIL import Image
########## Begin ##########
#调整一个像素的亮度
def enhancePixel(r, g, b, n):
er, eg, eb = r + n, g + n, b + n
er = min(255, er); er = max(0, er)
eg = min(255, eg); eg = max(0, eg)
eb = min(255, eb); eb = max(0, eb)
return er, eg, eb
########## End ##########
#调整图像文件1中所有像素的亮度,并将调整结果保存为图像文件2
#图像文件1和2的路径分别为path1和path2,n为调整量
def enhanceImg(path1, path2, n):
img = Image.open(path1)
w, h = img.size
for x in range(w):
for y in range(h):
r,g,b=img.getpixel((x, y)) #取出颜色
er, eg, eb = enhancePixel(r, g, b, n) #调整亮度
img.putpixel((x,y),(er, eg, eb)) #放回像素
img.save(path2)
path1 = 'src/step1/source/step1.jpg' #原始图像文件
path2 = 'src/step1/student/step1_2.jpg'#调整亮度后的图像文件
n = 50 #调整量
enhanceImg(path1, path2, 50)
i m a g e image image在 I m a g e Image Image库里有几种格式, R G B RGB RGB和 L L L分别是彩色图和灰度图,也是本次作业需要用到的两种。只需要记住, R G B RGB RGB模式的每个像素由三个数构成儿 L L L模式只由一个数构成。
from PIL import Image
#将一个RGB颜色转换成灰度值,结果保留整数
def RGBtoGray(r, g, b):
########## Begin ##########
gray = round(r * 0.299 + g * 0.587 + b * 0.114)
########## End ##########
return gray
#将真彩色图像转换成灰度图
#真彩色和灰度图的文件路径分别为path1和path2
def toGrayImage(path1, path2):
img1 = Image.open(path1) #真彩色图像,像素中是RGB颜色
w, h = img1.size
img2 = Image.new('L', (w, h)) #新建一个灰度图像,像素中是灰度值
########## Begin ##########
#此部分功能:依次取出img1中每个像素的RGB颜色,转换成灰度值,再放到img2的对应位置
for x in range(w) :
for y in range(h) :
r, g, b = img1.getpixel((x, y))
Gray = RGBtoGray(r, g, b)
img2.putpixel((x, y), Gray)
########## End ##########
img2.save(path2)
path1 = 'src/step2/source/step2.jpg' #真彩色图像
path2 = 'src/step2/student/step2_2.jpg' #灰度图像
toGrayImage(path1, path2)
下取整直接整除就完事儿了。
需要考虑回车问题(题目描述里已经写了)。
c o n v e r t convert convert函数是用来转换格式的。
from PIL import Image
#将一个灰度值转换成对应的字符
def GraytoChar(gray):
allChar = """@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'"""
########## Begin ##########
N = len(allChar)
char = allChar[N * gray // 256]
########## End ##########
return char
#将真彩色图像转换成字符画,真彩色图像文件路径为path
def toCharImage(path):
img = Image.open(path)
ow, oh = img.size #原始图像的宽和高
w = 80 #调整后的宽度(即字符画每行有w个字符)
h = w*oh//ow #高度也按比例调整(即字符画总共有h行)
h = h//2 #在文本中,行与行之间有间隔,要进一步缩小高度才能得到较好效果
img = img.resize((w, h)) #调整图片大小
img = img.convert('L') #将真彩色图像转换为灰度图
charImg = '' #用于存储字符画
########## Begin ##########
#将img中的灰度值逐一转换成字符,每得到一个字符,添加到charImg最后,转换完一行要添加换行符
for y in range(h) :
for x in range(w) :
gray = img.getpixel((x, y))
charImg += GraytoChar(gray)
charImg += '\n'
########## End ##########
return charImg
在去中位数的时候可以用我们之前说的方向矩阵的想法,中位数可以用 s o r t sort sort实现。
from PIL import Image
#求图像img中(x,y)处像素的中值c
def median(img, x, y):
########## Begin ##########
L = []
for i in range(-1, 2) :
for j in range(-1, 2) :
L.append(img.getpixel((x + i, y + j)))
L.sort()
c = L[4]
########## End ##########
return c
#对图像文件1进行降噪,并将结果保存为图像文件2
#图像文件1和2的路径分别为path1和path2
def denoise(path1, path2):
img1 = Image.open(path1) #图像1
img1 = img1.convert('L') #将图像1转换为灰度图
w, h = img1.size
img2 = Image.new('L', (w, h), 'white') #图像2
for x in range(1, w-1):
for y in range(1, h-1):
c = median(img1, x, y) #求中值
img2.putpixel((x,y), c) #将灰度设置为中值
img2.save(path2)
path1 = 'src/step4/source/step4.bmp' #带噪声的图像
path2 = 'src/step4/student/step4_2.bmp' #降噪后的图像
denoise(path1, path2)
可以造一个嵌套列表来处理卷积
from PIL import Image
Init = []
for i in range(3) :
Init.append([1] * 3)
Init[1][1] = -8
#求图像img中(x,y)处像素的卷积c
def convolute(img, x, y):
########## Begin ##########
mdl = 0
for i in range(-1, 2) :
for j in range(-1, 2) :
mdl += Init[i + 1][j + 1] * img.getpixel((x + i, y + j))
########## End ##########
return mdl
#对图像文件1进行边缘检测,并将结果保存为图像文件2
#图像文件1和2的路径分别为path1和path2
def detectEdge(path1, path2):
img1 = Image.open(path1) #图像1
img1 = img1.convert('L') #将图像1转换为灰度图
w, h = img1.size
img2 = Image.new('L', (w, h), 'white') #图像2
########## Begin ##########
##此部分功能:依次求img1中每个像素的卷积c,再将c放到img2的对应位置
for i in range(1, w - 1) :
for j in range(1, h - 1) :
mdl = convolute(img1, i, j);
if mdl > 0 :
mdl = 0
else :
mdl = 255
img2.putpixel((i, j), mdl)
########## End ##########
img2.save(path2)
path1 = 'src/step5/source/step5.bmp' #原始图像
path2 = 'src/step5/student/step5_2.bmp' #检测到的边缘图像
detectEdge(path1, path2)
可以稍微搞一个全局变量来更改 N N N,其余得跟别的题没啥区别。
from PIL import Image
a, b = 1, 2
N = 0
def Trans(x, y) :
rx = (x + b * y) % N
ry = (a * x + (a * b + 1) * y) % N
return rx, ry
########## Begin ##########
def enImg(path1, path2) :
global N
img1 = Image.open(path1)
w, h = img1.size
N = w
img2 = Image.new('RGB', (w, h))
for i in range(w) :
for j in range(h) :
x, y = Trans(i, j)
img2.putpixel((x, y), img1.getpixel((i, j)))
img2.save(path2)
########## End ##########
path1 = 'src/step6/source/step6.bmp' #原始图像
path2 = 'src/step6/student/step6_2.bmp' #加密后的图像
enImg(path1, path2)
感觉最近的题就是找函数…全网搜各种奇奇怪怪的函数