【Educoder作业】问题求解——图像处理

【Educoder作业】问题求解——图像处理

恢复更新了奥xdm

跟上一个作业差不多,主要是记住一些函数即可。

T1 图像亮度调整

这个题教我们 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)

T2 灰度图

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)

T3 字符画

下取整直接整除就完事儿了。
需要考虑回车问题(题目描述里已经写了)。
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


T4 图像降噪

在去中位数的时候可以用我们之前说的方向矩阵的想法,中位数可以用 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)

T5 图像边缘检测

可以造一个嵌套列表来处理卷积

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)

T6 图像置换加密

可以稍微搞一个全局变量来更改 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)

感觉最近的题就是找函数…全网搜各种奇奇怪怪的函数

你可能感兴趣的:(Educoder作业,图像处理,计算机视觉,opencv)