精华内容
下载资源
问答
  • 超全Python图像处理讲解(多图预警)

    万次阅读 多人点赞 2020-01-01 17:01:08
    文章目录Pillow模块讲解一、Image模块1.1 、打开图片和显示图片1.2、创建一个简单的图像1.3、图像混合(1)透明度混合(2)遮罩混合1.4、图像缩放(1)按像素缩放(2)按尺寸缩放1.5、图像的剪切与粘贴(1)图像粘贴...

    Pillow模块讲解

    一、Image模块

    1.1 、打开图片和显示图片

    对图片的处理最基础的操作就是打开这张图片,我们可以使用Image模块中的open(fp, mode)方法,来打开图片。open方法接收两个参数,第一个是文件路径,第二个是模式。主要的模式如下:

    mode(模式) bands(通道) 说明
    “1” 1 数字1,表示黑白二值图片,每个像素用0或1共1位二进制码表示
    “L” 1 灰度图
    “P” 1 索引图
    “RGB” 3 24位真彩图
    “RGBA” 4 “RGB”+透明通道
    “CMYK” 4 印刷模式图像

    光理论是不够的,在此送大家一套2020最新Python全栈项目视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!
    更多的模式也就不说了,关于模式的模式的详细介绍我也不知道。这个open方法返回一个Image对象,mode也不是必须参数。打开图片代码如下:

    from PIL import Image
    # 打开图片
    im = Image.open('test.jpg')
    # 显示图片
    im.show()
    

    当然显示图片不是我们的重点,我们获取Image对象之后,就可以获取它的一些信息了。

    print('图像的格式:', im.format)
    print('图像的大小:', im.size)
    print('图像的宽度:', im.width)
    print('图像的高度:', im.height)
    # 传入坐标的元组
    print('获取某个像素点的颜色值:', im.getpixel(100, 100))
    

    在我的环境中运行结果如下:

    图像的格式: JPEG
    图像的大小: (3968, 2976)
    图像的宽度: 3968
    图像的高度: 2976
    获取某个像素点的颜色值: (198, 180, 132)
    

    1.2、创建一个简单的图像

    在Image模块中,提供了创建图像的方法。主要是通过**Image.new(mode, size, color)**实现,该方法传入三个参数:

    • mode:图像的创建模式
    • size:图像的大小
    • color:图像的颜色

    用该方法可以创建一个简单的图像,之后我们可以通过save方法将图像保存:

    from PIL import Image
    # 创建一个简单的图像
    im = Image.new('RGB', (100, 100), 'red')
    # 保存这个图像
    im.save('red.png')
    

    生成图片如下:

    1.3、图像混合

    (1)透明度混合

    透明度混合主要是使用**Image中的blend(im1, im2, alpha)**方法,对该方法的解释如下:

    • im1:Image对象,在混合的过程中,透明度设置为(1-apha)
    • im2:Image对象,在混合的过程中,透明度设置为(apha)
    • alpha:透明度,取值是0-1。当透明度为0是,显示im1对象;当透明度为1时,显示im2对象

    注意:im1和im2的大小必须一样,且mode都为RGB

    代码实现如下:

    from PIL import Image
    
    # 打开im1
    im1 = Image.open('pic.jpg').convert(mode='RGB')
    # 创建一个和im1大小一样的图像
    im2 = Image.new('RGB', im1.size, 'red')
    # 混合图片,并显示
    Image.blend(im1, im2, 0.5).show()
    

    下面为原图和混合图的对比:

    不得不说,我家艾斯真滴帅。

    (2)遮罩混合

    接下来就是很迷的时刻了,我们可以通过Image.composite(im1, im2, mask)方法实现遮罩混合。三个参数都是Image对象,该方法的作用就是使用mask来混合im1和im2。我是听不懂,你们能听懂最好给我讲一下。具体实现如下:

    # 这句代码写了好多遍,我真不想写了
    from PIL import Image
    # 打开图像1
    im1 = Image.open('pic1.jpg')
    # 打开图像2
    im2 = Image.open('pic2.jpg')
    # 重新设置im2的大小
    im2.resize(im1.size)
    # 将图像2的三个色道分离,其中r、g、b都为Image对象
    r, g, b = im2.split()
    # 遮罩混合
    Image.composite(im1, im2, b).show()
    

    注意:im1、im2和mask的大小必须一样

    im1、im2和遮罩混合效果对比如下:

    依旧是我帅气的艾斯。

    1.4、图像缩放

    (1)按像素缩放

    按像素缩放通过Image.eval(im1, fun)方法实现,其中im1为我们老生常谈的Image对象了;第二个为一个方法(函数),该函数传入一个参数,即像素点。该函数会对图片中每个像素点进行函数内的操作。下面我们对来简单使用一下这个方法:

    from PIL import Image
    # 打开一张图像
    im = Image.open('抠鼻屎.jpg')
    # 对该图像每个像素点进行*2处理
    Image.eval(im, lambda x:x*2).show()
    

    这里我使用的lambda表达式,当然一般也都是用lambda表达式,不过你也可以像下面这样写:

    # 定义一个方法
    def func(x):
        return x*2
    # 对图像im每个像素点进行func中的操作,其中func不能加()
    Image.eval(im, func)
    

    效果图如下:

    细心的读者应该可以发现,这个抠鼻屎的图片和笔者头像并不完全一样。在血色方面,笔者的头像确实要差几分。

    注意:笔者在日常生活中可不是天天在大街上抠鼻屎的那种。

    (2)按尺寸缩放

    按尺寸缩放是通过Image对象的thumbnail()方法实现的,这里不同于前面直接通过Image调用方法,而是使用Image的具体实例im2调用thumbnail方法,从而对im2直接进行处理。具体代码如下:

    from PIL import Image
    # 打开图像
    im1 = Image.open('xx.jpg')
    # 复制图像
    im2 = im1.copy()
    # 将复制后的图像进行缩放,传入一个元组
    im2.thumbnail((100, 100))
    # 输出图像大小
    print("im1的大小", im1.size)
    print('im2的大小', im2.size)
    

    这里缩放图像并不会对图像进行变形,即显示效果是一样的。这里就不放效果图了,输入结果如下:

    im1的大小 (960, 960)
    im2的大小 (100, 100)
    

    1.5、图像的剪切与粘贴

    (1)图像粘贴

    粘贴的实现主要是通过Image对象的paste(im, box, mask)方法,其中im为Image对象;box为要粘贴到的区域;mask为遮罩(我也不知道啥是遮罩)。其中box的参数有三种形式:

    • (x1, y1):将im左上角对齐(x1,y1)点,其余部分粘贴,超出部分抛弃
    • (x1, x2, y1, y2):将im粘贴至此区域
    • None:此时im必须与源图像大小一致

    (2)裁剪图像

    裁剪主要通过Image对象的crop(box)方法实现,box同粘贴中一致。

    接下来我们做一个小练习,想将图像某个区域剪切下来,然后粘贴到另一个图像上:

    from PIL import Image
    # 打开图像
    im = Image.open('nnz.jpg')
    # 复制两份
    im1 = im.copy()
    im2 = im.copy()
    # 剪切图片
    im_crop = im1.crop((200, 200, 400, 400))
    # 粘贴图片
    im2.paste(im_crop, (30, 30))
    im2.show()
    

    原图和效果图对比如下:

    貌美如花的娜娜子。

    1.4、图像旋转和格式转换

    (1)图像旋转

    图像旋转就非常简单了,简单的一句代码,通过Image对象调用rotate(),该方法返回被旋转图像的一个副本:

    from PIL import Image
    im = Image.open('nnz.jpg')
    # 旋转90度然后显示
    im.rotate(90).show()
    

    顺时针逆时针就不要问我了。

    (2)格式转换

    • convert:转换图像的模式
    • transpose:转换图像的格式

    convert之前已经使用过了,这里就简单演示一下transpose的作用,transpose主要传入一些Image中的常量:

    from PIL import Image
    # 打开图像
    im = Image.open('nnz.jpg')
    # 这里我也不知道注释啥了,总之效果和rotate(90)效果一样
    im.transpose(Image.ROTATE_90).show()
    

    效果图我也就不放了,给大家列出一些可以传入的常量和该常量的作用:

    常量 作用
    Image.FILP_TOP_BOTTOM 上下翻转
    Image.FILP_LEFT_RIGHT 左右翻转
    Image.ROTATE_90 翻转90°
    Image.ROTATE_180 翻转180°
    Image.TRANSPOSE 颠倒

    我也不知道这是哪门子的格式转换。

    1.5、分离和合并

    (1)分离

    这个是之前使用过的,通过Image对象的split()方法,将图像的RGB三个通道分离,并返回三个Image对象:

    from PIL import Image
    # 打开图像
    im = Image.open('nnz.jpg')
    # 分离通道,返回3个Image对象
    r, g, b = im.split()
    

    三个通道的效果图如下:

    (2)合并

    合并是通过Image.merge(mode, bands)方法实现的,其中mode为模式,bands为通道列表,传入一个列表类型数据。下面我实现以下小新多年来的愿望:

    from PIL import Image
    # 打开小新.jpg和娜娜子.jpg
    im1 = Image.open('娜娜子.jpg')
    im2 = Image.open('小新.jpg')
    # 让im2大小和im1一样
    im2.resize(im1.size)
    # 将两个图像分别分离
    r1, g1, b1 = im1.split()
    r2, g2, b2 = im2.split()
    # 合并图像
    im3 = Image.merge('RGB', [r1, g2, b1])
    im3.show()
    

    效果图如下,看到这么美的图片,小新一定会感谢我的:

    到这里,我们就把Image模块的大致内容讲解完了,接下来我们来了解PIL中更丰富的功能。

    二、ImageFilter

    ImageFilter中提供了很多常用的滤镜功能,

    2.1、高斯模糊

    高斯模糊也叫高斯平滑,是啥我也不知道,反正听名字就是模糊。我们结合上面的内容完成一个小案例:

    from PIL import Image, ImageFilter
    # 打开图像
    im1 = Image.open('iron_man.jpg')
    # 创建一个im1两倍宽的图像
    img = Image.new('RGB', (im1.width*2, im1.height), 'red')
    # 高斯模糊处理
    im2 = im1.filter(ImageFilter.GaussianBlur)
    # 将im1粘贴到img上
    img.paste(im1, (0, 0))
    # 将im2(高斯模糊后的图像)粘贴到img上
    img.paste(im2, (im1.width, 0))
    img.show()
    

    为了考虑小新的感受,下面不再用娜娜子作为素材。我选取了一张钢铁侠的图片,运行结果如下:

    希望各位读者不要误会,他俩真没说你帅,他俩只说笔者一个人帅。

    2.2、其它滤镜

    除了高斯模糊,ImageFilter中还提供了许多其它滤镜:

    滤镜值 滤镜名词
    BLUR 模糊效果
    CONTOUR 轮廓
    DETAIL 细节
    EDGE_ENHANCE 边缘增强
    EDGE_ENHANCE_MORE 边缘增强plus
    EMBOSS 浮雕效果
    FIND_EDGES 寻找边缘
    SMOOTH 平滑

    笔者用一张美女图片,测试了上面几个滤镜的效果,发现9张图是看起来是完全一样的。虽然完全一样,但是笔者还是打算将这次测试的结果作为我慈善事业的一部分,分享给各位读者。

    其中1为高斯模糊,2-9分别为表格中的8个滤镜。

    三、ImageChops模块(图像合成)

    ImageChops模块中,提供了很多图像合成的方法。这些方法是通过计算通道中像素值来实现的,不同的方法有不同的计算方式。

    3.1、加法运算

    加法运算通过**ImageChops.add(image1, image2, scale=1.0, offset=0)**方法实现,合成公式如下:

    out = (im1 + im2)/scale + offset
    

    我也看不懂,其中scale和offset是有默认值的。所以使用时我们可以省略参数,具体实现如下:

    from PIL import Image, ImageChops
    # 打开图像
    im1 = Image.open('im1.jpg')
    im2 = Image.open('im2.jpg')
    # 合成图像并显示
    im3 = ImageChops.add(im1, im2)
    im3.show()
    

    实验结果产不忍赌,效果图如下:

    在这里插入图片描述

    3.2、减法运算

    加法运算通过**ImageChops.subtract(image1, image2, scale=1.0, offset=0)**方法实现,合成公式如下:

    out = (im1 - im2)/scale + offset
    

    其使用和add方法是一致的,代码如下:

    from PIL import Image, ImageChops
    # 打开图像
    im1 = Image.open('xscn.jpg')
    im2 = Image.open('xscn2.jpg')
    # 合成图像并显示
    im3 = ImageChops.subtract(im1, im2)
    im3.show()
    

    原本是不想放效果图的,但是运行后,发现效果图比较美,所以想和大家分享一下:

    在这里插入图片描述

    希望大家读到这篇博客的时候是独自一人的深夜。

    3.3、其它函数

    因为大多数函数的使用都比较简单,所以后续的函数也不单独拿出来讲了,具体功效可以看下列表:

    函数名 参数 作用 计算公式
    darker(变暗) (image1, image2) 对比两种图片的像素,取两种图片中对应像素的较小值。(去亮留暗) min(im1, im2)
    lighter(变亮) 同上 对比两种图片的像素,取两种图片中对应像素的较大值。(去暗留亮) max(im1, im2)
    invert(反色) (image) 将max(255)减去每个像素的值 max-image
    multiply(叠加) (image1, image2) 两种图片互相叠加。如果和黑色叠加,将获得一张很色图片 im1*im2/max
    screen(屏幕) 同上 先反色后叠加 max-((max-im1)*(max-im2)/max)
    difference(比较) 同上 各个像素做减法,取绝对值。如果像素相同结果为黑色 abs(im1-im2)

    演示代码如下:

    from PIL import Image, ImageChops
    
    # 打开图像
    im1 = Image.open("im1.jpg")
    im2 = Image.open("im2.jpg")
    
    # 对图像进行各种操作
    im3 = ImageChops.darker(im1, im2)
    im3.save('darker.jpg')
    im3 = ImageChops.lighter(im1, im2)
    im3.save('lighter.jpg')
    im3 = ImageChops.invert(im1)
    im3.save('invert.jpg')
    im3 = ImageChops.multiply(im1, im2)
    im3.save('multiply.jpg')
    im3 = ImageChops.screen(im1, im2)
    im3.save('screen.jpg')
    im3 = ImageChops.difference(im1, im2)
    im3.save('difference.jpg')
    

    其中,我选取的素材im1和im2都是上面使用到的那两张,效果图如下:

    在这里插入图片描述

    这样,我的女神就被我毁的体无完肤了。

    四、ImageEnhance模块(色彩、亮度)

    ImageEnhance提供了许多函数,用于调整图像的色彩、对比度、亮度、清晰度等。调整图像的步骤如下:

    1. 确定要调整的参数,获取特定的调整器
    2. 调用调整器的enhance方法,传入参数进行调整。

    注意:所有调整器都实现同一个接口,该接口中包含一个方法enhance

    其中enhance方法接收一个参数factor,factor是一个大于0的数。当factor为1时,返回原图,当factor小于1返回减弱图,大于1返回增强图。

    各个获取色彩调整器的方法如下:

    方法名称 方法作用
    ImageEnhance.Color() 获取颜色调整器
    ImageEnhance.Contrast() 获取对比度调整器
    ImageEnhance.Brightness() 获取亮度调整器
    ImageEnhance.Sharpness() 获取清晰度调整器

    虽然是很想偷懒,不去做实验,但是想想还是做了如下实验,代码如下:

    from PIL import Image, ImageEnhance
    # 打开im1
    im1 = Image.open("gtx.jpg")
    # 获取颜色(各种)调整器
    enhance_im1 = ImageEnhance.Color(im1)
    #enhance_im1 = ImageEnhance.Contrast(im1)
    #enhance_im1 = ImageEnhance.Brightness(im1)
    #enhance_im1 = ImageEnhance.Sharpness(im1)
    # 减弱颜色(以及其它属性)
    im2 = enhance_im1.enhance(0.5)
    # 增强颜色(以及其它属性)
    im3 = enhance_im1.enhance(1.5)
    
    # 获取原图大小
    w, h = im1.size
    # 创建一个原图大小3倍的图片
    img = Image.new("RGB", (w*3, h))
    # 将减弱的图片放在最左边
    img.paste(im2, (0, 0))
    # 将原图放在中间
    img.paste(im1, (w, 0))
    # 将增强后的图片放在最右边
    img.paste(im3, (w*2, 0))
    # 显示图片
    img.show()
    

    其中,我们只需要修改获取调整器的代码就可以了,获取其它调制器的代码我注释了。然后看看效果图:

    在这里插入图片描述

    这种不伤大雅的工作,让我唐尼叔做再适合不过了。

    另外再讲一个调节亮度的函数,但是这个函数时Image中的函数point(),而不是ImageEnhance的。该函数传入一个参数,使用方法和Image.eval()类似,使用示例如下:

    from PIL import Image
    # 打开图像
    im1 = Image.open('gtx.jpg')
    
    # 变暗操作
    im2 = im1.point(lambda x:x*0.5)
    # 变量操作
    im3 = im1.point(lambda x:x*1.5)
    # 获取原图大小
    w, h = im1.size
    # 创建一个原图大小3倍的图片
    img = Image.new("RGB", (w*3, h))
    # 将减弱的图片放在最左边
    img.paste(im2, (0, 0))
    # 将原图放在中间
    img.paste(im1, (w, 0))
    # 将增强后的图片放在最右边
    img.paste(im3, (w*2, 0))
    # 显示图片
    img.show()
    

    效果图如下:

    在这里插入图片描述

    五、ImageDraw模块

    该模块提供了许多绘制2D图像的功能,我们可以通过绘制获取一个全新的图像,也可以在原有的图像上进行绘制。在我们使用该模块进行绘制时,我们需要先获取ImageDraw.Draw对象,获取方式如下:

    from PIL import ImageDraw
    # 构造函数中,im为一个Image对象
    drawer = ImageDraw.Draw(im)
    

    我们获取ImageDraw.Draw对象后就可以进行相应的绘制了。

    5.1、绘制简单形状

    在绘制之前,我们先创建一个空白的图片:

    from PIL import Image, ImageDraw
    
    # 创建一个300*300的白色图片
    im = Image.new("RGB", (300, 300), "white")
    # 获取ImageDraw.Draw对象
    drawer = ImageDraw.Draw(im)
    

    后续的绘制都可以使用对象drawer绘制。

    (1)绘制直线

    """
    xy:起点坐标和终点坐标(x1, y1, x2, y2)
    fill:填充色。"red"、"blue"...
    width:轮廓粗细
    joint:连接方式,可以是曲线
    """
    line(xy, fill, width, joint)
    # 绘制直线
    drawer.line((50, 50, 150, 150), fill='green',width=2)
    

    (2)绘制矩形

    """
    xy:左上角坐标和右下角坐标(x1, y1, x2, y2)
    fill:填充色。"red"、"blue"...
    outline:轮廓色。同上
    width:轮廓粗细
    """
    rectangle(xy, fill, outline, width)
    # 使用示例
    drawer.rectangle((50, 50, 150, 150), fill='green', outline='red', width=3)
    

    (3)绘制圆弧

    """
    xy:包含圆弧所在圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
    start:起始角度
    end:终止角度
    fill:填充色。"red"、"blue"...
    width:轮廓粗细
    """
    arc(xy, start, end, fill, width)
    # 使用示例
    drawer.arc((50, 50, 150, 150), start=0, end=90, fill='green', width=3)
    

    对于xy参数的解释如图所示:

    在这里插入图片描述

    (4)绘制椭圆

    """
    xy:包含椭圆(或圆)的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
    fill:填充色。"red"、"blue"...
    outline:轮廓颜色
    width:轮廓粗细
    """
    ellipse(xy, fill, outline, width)
    # 使用示例
    drawer.ellipse((50, 50, 150, 150),fill='green', outline='red', width=3)
    

    (5)绘制弦

    
    """
    xy:弦所在椭圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
    start:开始角度
    end:终点角度
    fill:填充色。"red"、"blue"...
    outline:轮廓颜色
    width:轮廓粗细
    """
    chord(xy, start, end, fill, outline, width)
    # 使用示例
    drawer.chord((50, 50, 150, 150),start=0, end=90, fill='green', outline='red', width=3)
    

    (6)绘制扇形

    
    """
    xy:扇形所在椭圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
    start:开始角度
    end:终点角度
    fill:填充色。"red"、"blue"...
    outline:轮廓颜色
    width:轮廓粗细
    """
    pieslice(xy, start, end, fill, outline, width)
    # 使用示例
    drawer.pieslice((50, 50, 150, 150),start=0, end=90, fill='green', outline='red', width=3)
    

    (7)绘制多边形

    """
    xy:多边形各个点坐标的元组/列表(x1, y1, x2, y2)
    fill:填充色。"red"、"blue"...
    outline:轮廓颜色
    """
    pieslice(xy, fill, outline)
    # 使用示例
    drawer.polygon((50, 50, 150, 150, 150, 200, 200, 250, 50, 50), fill='green', outline='red')
    

    (8)绘制点

    """
    xy:点的坐标
    fill:填充色。"red"、"blue"...
    """
    point(xy, fill)
    # 使用示例
    drawer.point((100, 100), fill='black')
    

    除了上面这些简单图形外,我们还可以使用Draw绘制文字。

    5.2、绘制文字

    绘制文字和绘制图形是一样的:

    """
    xy:起点坐标
    text:绘制的文本
    fill:填充色。"red"、"blue"...
    ...其中绘制文字还有许多其它参数
    """
    text(xy, text, fill)
    # 使用示例
    drawer.text((100, 100), text='zack' fill='red')
    

    当我们绘制中文时,上述代码会报错,因为默认编码是不支持中文的。我们可以在C:/Windows/Fonts目录下找到字体文件,我们选择一个支持中文的。我这里直接是将字体文件复制到项目底下来了,代码如下:

    from PIL import Image, ImageDraw, ImageFont
    # 创建一个图像用于绘制文字
    im = Image.new("RGB", (300, 300), "white")
    drawer = ImageDraw.Draw(im)
    # 获取字体对象
    imFont = ImageFont.truetype('simkai.ttf', 30)
    # 绘制文字时设置字体
    drawer.text((50, 100),text="啥",font=imFont,fill="red")
    im.show()
    

    最后送大家一套2020最新Pyhon项目实战视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!

    我们使用了ImageFont.truetype()函数获取字体对象,在获取时我们可以设置字体大小。到此我们就了解了PIL的各种操作了,感兴趣的读者可以关注我的个人公众号:ZackSock。

    展开全文
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
    1.图像基础知识
    2.OpenCV读写图像
    3.OpenCV像素处理

    PS: 文章也学习了网易云高登教育的知识,推荐大家学习。

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

    一.图像基础知识

    图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

    图像通常包括二值图像、灰度图像和彩色图像。

    1.二值图像
    二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

    2.灰度图像
    灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
    (1) 浮点算法:Gray=R0.3+G0.59+B0.11
    (2) 整数方法:Gray=(R
    30+G59+B11)/100
    (3) 移位方法:Gray=(R28+G151+B77)>>8;
    (4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
    (5) 仅取绿色:Gray=G;
    (6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R
    0.299+G*0.587+B0.144

    通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

    3.彩色图像
    彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。



    二.OpenCV读写图像

    本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

    1.读入图像
    OpenCV读图像主要调用下面函数实现:

    img = cv2.imread(文件名,[,参数])
    参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
    参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
    参数(3) cv2.IMREAD_COLOR (读入彩色图像)
    参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

    2.显示图像
    显示图像调用函数如下:

    cv2.imshow(窗口名, 图像名)

    3.窗口等待
    调用函数如下:

    cv2.waitKey(delay)
    键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

    4.删除所有窗口
    调用函数如下:

    cv2.destroyAllWindows() 删除所有窗口
    cv2.destroyWindows() 删除指定的窗口

    5.写入图片
    调用函数如下:

    retval = cv2.imwrite(文件地址, 文件名)

    下面代码是读入图片并显示保存。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg")
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

    如果代码中没有watiKey(0)函数,则运行结果如下图所示:

    同时
    可以对代码进行升级,如下所示:

    #无限期等待输入
    k=cv2.waitKey(0)
    #如果输入ESC退出
    if k==27:
        cv2.destroyAllWindows()
    


    三.OpenCV像素处理

    1.读取像素
    灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

    灰度图像:返回值 = 图像(位置参数)
    eg: test=img[88,42]
    彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
    eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

    2.修改图像
    修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

    灰度图像:
    img[88,142] = 255
    彩色图像:
    img[88,142, 0] = 255
    img[88,142, 1] = 255
    img[88,142, 2] = 255
    彩色图像:方法二
    img[88,142] = [255, 255, 255]

    下面代码是获取像素及修改的操作。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    test = img[88,142]
    print test
    img[88,142] = [255, 255, 255]
    print test
    
    #分别获取BGR通道像素
    blue = img[88,142,0]
    print blue
    green = img[88,142,1]
    print green
    red = img[88,142,2]
    print red
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    输出结果如下所示:
    [158 107 64]
    [255 255 255]
    255
    255
    255

    下面代码是将行为100到200、列150到250的像素区域设置为白色。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #该区域设置为白色
    img[100:200, 150:250] = [255,255,255]
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    运行结果如下图所示:

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
    (By:Eastmount 2018-08-16 夜11点 https://blog.csdn.net/Eastmount/


    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    展开全文
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    前文参考:
    [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
    [Python图像处理] 二.OpenCV+Numpy库读取与修改像素
    [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
    [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
    [Python图像处理] 五.图像融合、加法运算及图像类型转换

    本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。全文均是基础知识,希望对您有所帮助。
    1.图像缩放
    2.图像旋转
    3.图像翻转
    4.图像平移

    PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。
    推荐原理文章:OpenCV2:图像的几何变换,平移、镜像、缩放、旋转

    投票闲谈:
    最后希望大家帮我2019年CSDN博客之星投投票,每天可以投5票喔,截止时间2020年2月19日,谢谢大家!八年,在CSDN分享了410篇文章,15个专栏,400多万人次浏览,包括Python人工智能、数据挖掘、网络爬虫、图象处理、网络安全、JAVA网站、Android开发、LAMP/WAMP、C#网络编程、C++游戏、算法和数据结构、面试总结、人生感悟等。当然还有我和你的故事,感恩一路有你,感谢一路同行,希望通过编程分享帮助到更多人,也希望学成之后回贵州教更多学生。因为喜欢,所以分享,且看且珍惜,加油!等我四年学成归来~

    投票地址:http://m234140.nofollow.ax.mvote.cn/opage/ed8141a0-ed19-774b-6b0d-39c3aaf89dde.html?from=singlemessage

    在这里插入图片描述



    一.图像缩放

    图像缩放主要调用resize()函数实现,具体如下:
    result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])
    其中src表示原始图像,dsize表示缩放大小,fx和fy也可以表示缩放大小倍数,他们两个(dsize或fx\fy)设置一个即可实现图像缩放。例如:

    1. result = cv2.resize(src, (160,160))
    2. result = cv2.resize(src, None, fx=0.5, fy=0.5)

    图像缩放:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,sx、sy为缩放因子,则公式如下:
    [x0y01]=[xy1][sx000sy0001](1) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] =\left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} sx & 0 & 0 \\ 0 & sy & 0 \\ 0 & 0 & 1 \end{matrix} \right] \tag{1}

    代码示例如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
     
    #读取图片
    src = cv2.imread('test.jpg')
    
    #图像缩放
    result = cv2.resize(src, (200,100))
    print result.shape
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示,图像缩小为(200,100)像素。

    需要注意的是,代码中 cv2.resize(src, (200,100)) 设置的dsize是列数为200,行数为100。
    同样,可以获取原始图像像素再乘以缩放系数进行图像变换,代码如下所示。

    #encoding:utf-8
    import cv2  
    import numpy as np  
     
    #读取图片
    src = cv2.imread('test.jpg')
    rows, cols = src.shape[:2]
    print rows, cols
    
    #图像缩放 dsize(列,行)
    result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    最后讲解(fx,fy)缩放倍数的方法对图像进行放大或缩小。

    #encoding:utf-8
    import cv2  
    import numpy as np  
     
    #读取图片
    src = cv2.imread('test.jpg')
    rows, cols = src.shape[:2]
    print rows, cols
    
    #图像缩放
    result = cv2.resize(src, None, fx=0.3, fy=0.3)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    最后输出的结果如下图所示,这是按例比0.3*0.3缩小的。



    二、图像旋转

    图像旋转主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转,具体如下:

    • M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
      参数分别为:旋转中心、旋转度数、scale
    • rotated = cv2.warpAffine(src, M, (cols, rows))
      参数分别为:原始图像、旋转参数、原始图像宽高

    图像旋转:设(x0, y0)是旋转后的坐标,(x, y)是旋转前的坐标,(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标,则公式如下:
    [x0y01]=[xy1][100010mn1][cosasina0sinacosa0001][100010lefttop1](1) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] = \left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ -m & n & 1 \end{matrix} \right] \left[ \begin{matrix} cosa & -sina & 0 \\ sina & cosa & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ left & top & 1 \end{matrix} \right] \tag{1}

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
     
    #读取图片
    src = cv2.imread('test.jpg')
    
    #原图的高、宽 以及通道数
    rows, cols, channel = src.shape
    
    #绕图像的中心旋转
    #参数:旋转中心 旋转度数 scale
    M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
    #参数:原始图像 旋转参数 元素图像宽高
    rotated = cv2.warpAffine(src, M, (cols, rows))
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("rotated", rotated)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    如果设置-90度,则核心代码和图像如下所示。
    M = cv2.getRotationMatrix2D((cols/2, rows/2), -90, 1)
    rotated = cv2.warpAffine(src, M, (cols, rows))



    三、图像翻转

    图像翻转在OpenCV中调用函数flip()实现,原型如下:
    dst = cv2.flip(src, flipCode)
    其中src表示原始图像,flipCode表示翻转方向,如果flipCode为0,则以X轴为对称轴翻转,如果fliipCode>0则以Y轴为对称轴翻转,如果flipCode<0则在X轴、Y轴方向同时翻转。

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test.jpg')
    src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    
    #图像翻转
    #0以X轴为对称轴翻转 >0以Y轴为对称轴翻转 <0X轴Y轴翻转
    img1 = cv2.flip(src, 0)
    img2 = cv2.flip(src, 1)
    img3 = cv2.flip(src, -1)
    
    #显示图形
    titles = ['Source', 'Image1', 'Image2', 'Image3']  
    images = [src, img1, img2, img3]  
    for i in xrange(4):  
       plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    输出结果如下图所示:



    四、图像平移

    图像平移:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,dx、dy为偏移量,则公式如下:
    [x0y01]=[xy1][100010dxdy1](3) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] =\left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ dx & dy & 1 \end{matrix} \right] \tag{3}

    图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下:
    M = np.float32([[1, 0, x], [0, 1, y]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

    完整代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test.jpg')
    image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    
    #图像平移 下、上、右、左平移
    M = np.float32([[1, 0, 0], [0, 1, 100]])
    img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, 0], [0, 1, -100]])
    img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, 100], [0, 1, 0]])
    img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, -100], [0, 1, 0]])
    img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    #显示图形
    titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  
    images = [img1, img2, img3, img4]  
    for i in xrange(4):  
       plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    输出结果如下图所示:

    三尺讲台,三寸舌,
    三千桃李,三杆笔。
    再累再苦,站在讲台前就是最美的自己,几个月的烦恼和忧愁都已消失,真的好享受这种状态,仿佛散着光芒,终于给低年级的同学上课了越早培养编程兴趣越好,恨不能倾囊相授。
    即使当一辈子的教书匠,平平淡淡也喜欢,而且总感觉给学生讲课远不是课酬和职称所能比拟,这就是所谓的事业,所谓的爱好。
    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。 准备出去休回家了,好好享受最美时光。
    (By:Eastmount 2018-09-06 早10点 https://blog.csdn.net/Eastmount/)


    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    展开全文
  • 图像的DCT算法

    万次阅读 多人点赞 2018-06-27 14:58:09
    DCT,即离散余弦变换,常用图像压缩算法,步骤如下 1)分割,首先将图像分割成8x8或16x16的小块; 2)DCT变换,对每个小块进行DCT变换; 3)舍弃高频系数(AC系数),保留低频信息(DC系数)。高频系数一般保存的...

    一,背景介绍
    DCT,即离散余弦变换,常用图像压缩算法,步骤如下
    1)分割,首先将图像分割成8x8或16x16的小块;
    2)DCT变换,对每个小块进行DCT变换;
    3)舍弃高频系数(AC系数),保留低频信息(DC系数)。高频系数一般保存的是图像的边界、纹理信息,低频信息主要是保存的图像中平坦区域信息。
    4)图像的低频和高频,高频区域指的是空域图像中突变程度大的区域(比如目标边界区域),通常的纹理丰富区域。

    二,图像
    二维DCT变换就是将二维图像从空间域转换到频率域。形象的说,就是计算出图像由哪些二维余弦波构成
    F=AfATF = AfA^T
    A(i,j)=c(i)cos[(j+0.5)πNi]A(i,j) = c(i) cos[\frac{(j+0.5)\pi} {N}i]

    其中F就是变换得到的系数,f是图像的像素值,A是转换矩阵,其中i为二维波的水平方向频率,j为二维波的垂直方向频率,取值范围都是0-(N-1),N是图像块的大小,
    c(i)={1N,i=02N,i0c(i)=\left\{ \begin{array}{rcl} \sqrt{\frac{1}{N}}, & & {i =0}\\ \sqrt{\frac{2}{N}}, & & {i \neq{0}}\\ \end{array} \right.
    1)求出转换矩阵A;
    2)利用转换矩阵A,转换到频域,即由图像 f 得到系数矩阵F。

    三,Matlab实现图像块DCT变换

    clc;clear;
    f = (rand(4,4)*100); % 生成4x4块
    % 1,根据公式,生成转换矩阵A
    for i=0:3
        for j=0:3
            if i == 0
                c = sqrt(1/4);
            else
                c = sqrt(2/4);
            end
            A(i+1, j+1) = c * cos( (j + 0.5)* pi * i / 4 ); % 生成转换矩阵
        end
    end
    
    % 2,利用转换矩阵A,进行转换
    dct_my = A*f*A'; % 转换
    dct_matlab = dct2(f); % matlab自带函数转换
    
    

    结果:

    
    f =
    
       89.0903   14.9294   81.4285   19.6595
       95.9291   25.7508   24.3525   25.1084
       54.7216   84.0717   92.9264   61.6045
       13.8624   25.4282   34.9984   47.3289
    
    
    dct_my =
    
      197.7977   21.3312    5.8547   40.7995
       10.7399   48.3374   21.6041   46.3630
      -34.4348  -18.4205    0.7236   18.6270
       51.2061  -20.9533  -41.4148    8.2377
    
    
    dct_matlab =
    
      197.7977   21.3312    5.8547   40.7995
       10.7399   48.3374   21.6041   46.3630
      -34.4348  -18.4205    0.7236   18.6270
       51.2061  -20.9533  -41.4148    8.2377
    
    >> 
    

    四,DCT反变换
    F=AfATF=AfA^T
    f=A1F(AT)1f = A^{-1} F (A^T)^{-1}
    A是正交矩阵,所以有AT=A1A^T=A^{-1},所以求得:
    f=ATFAf = A^TFA
    五,Matlab实现DCT反变换
    基于前面得到的转换矩阵A,则DCT反转换后面加一行代码即可:f_convert=AFAf\_convert = A'FA

    clc;clear;
    f = (rand(4,4)*100); % 生成4x4块
    for i=0:3
        for j=0:3
            if i == 0
                c = sqrt(1/4);
            else
                c = sqrt(2/4);
            end
            A(i+1, j+1) = c * cos( (j + 0.5)* pi * i / 4 );
        end
    end
    
    dct_my = A*f*A';
    dct_matlab = dct2(f);
    
    f_convert = A'*dct_my*A;
    
    
    
    f =
    
       22.8977   53.8342   10.6653   81.7303
       91.3337   99.6135   96.1898   86.8695
       15.2378    7.8176    0.4634    8.4436
       82.5817   44.2678   77.4910   39.9783
    
    
    dct_my =
    
      204.8538    1.1802    9.6825   -7.4417
       21.7177  -30.4859    8.3810  -50.0097
        1.8694   -9.0912   10.7823   -3.4473
     -121.8989  -10.6487   16.1003  -22.1974
    
    
    dct_matlab =
    
      204.8538    1.1802    9.6825   -7.4417
       21.7177  -30.4859    8.3810  -50.0097
        1.8694   -9.0912   10.7823   -3.4473
     -121.8989  -10.6487   16.1003  -22.1974
    
    
    f_convert =
    
       22.8977   53.8342   10.6653   81.7303
       91.3337   99.6135   96.1898   86.8695
       15.2378    7.8176    0.4634    8.4436
       82.5817   44.2678   77.4910   39.9783
    
    >> 
    

    六,对图像进行DCT变换
    效果图,分别是原图,所有dct系数小块组成图,反dct变换回来的图:
    这里写图片描述

    将图像分成8x8的小块,对每个小块依次进行dct变换,反变换回来时,也是依次处理每个小块。
    matlab代码:

    clc;clear;
    img = rgb2gray(imread('D:\Code\Image\girl.jpg'));
    figure, imshow(img); 
    
    % 1,使图像行列为 8的倍数
    [row,col] = size(img);
    row = round(row/8) * 8; 
    col = round(col/8) * 8;
    img = imresize(img, [row, col]);
    
    % 2,对图像块进行dct变换
    img_dct = zeros(row, col); % 存放转换后的dct系数
    for i=1:8:row-7
        for j=1:8:col-7
            img_block = img(i:i+7, j:j+7);
            dct_block = dct2(img_block); % 也可用刚才实现的(定义成一个函数即可)
            % imshow(dct_block); % 显示dct块
            img_dct(i:i+7, j:j+7) = dct_block;
        end
    end
    figure, imshow(img_dct); % 显示生成的dct系数
    
    % 3,dct反变换
    new_img = zeros(row,col);
    for i=1:8:row-7
        for j=1:8:col-7
            dct_block = img_dct(i:i+7, j:j+7);
            img_block = idct2(dct_block); % 也可用刚才实现的(定义成一个函数即可)
            new_img(i:i+7, j:j+7) = img_block;
        end
    end
    figure,  imshow(mat2gray(new_img)); % 显示反变换回来的图像
    
    

    放大后的dct系数块组成的图像:
    这里写图片描述

    1)发现每个小块的左上角,即一个DC系数,最亮,保存的是原图像低频信息,反应的是空域图像中平坦区域的信息;
    2)小块的其他地方,即63个AC系数,保存的是高频信息,反应的是空域图像中的突变区域的信息;
    3)对整个图像而言,背景区域是平坦区域,没有纹理信息,所以AC系数很小,而代表亮度信息的DC系数很大;
    4)头发区域不仅含有亮度信息,纹理信息也丰富,所以AC系数值很大。

    七,不分块,直接对整个图像DCT变换

    clc;clear;
    img = rgb2gray(imread('D:\Code\Image\girl.jpg'));
    figure, imshow(img); 
    
    % 1,对整个图像dct变换
    dct_img = dct2(img);
    figure, imshow(log(abs(dct_img)), colormap(gray(5)));
    colorbar;
    
    % 2,量化, 使得矩阵中小于0.1的值置为0,变得稀疏
    dct_img(abs(dct_img)<0.1)=0; 
    
    % 3,反变换回来
    new_img = idct2(dct_img);
    new_img = mat2gray(new_img);
    figure, imshow(new_img);  
    

    效果图,分别是原图、整个图像变换后系数图、反变换得到的图:
    这里写图片描述

    展开全文
  • 前面一篇文章我讲解了Python图像量化、采样处理及图像金字塔。本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的...
  • python人工智能-图像识别

    万次阅读 多人点赞 2019-02-16 09:25:34
    PIL:(Python Imaging Library)是Python平台上的图像处理标准库,功能非常强大。 pytesseract:图像识别库。 我这里使用的是python3.6,PIL不支持python3所以使用如下命令 pip install pytesseract pip ...
  • 拉普拉斯锐化图像

    万次阅读 多人点赞 2015-10-22 10:38:01
    拉普拉斯实现图像锐化,matlab实现
  • 单独对某个通道而言,把一幅图像中每一个像素出现的次数都统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把该像素出现的频率用图表示出来,就构成了灰度直方图。...
  • [Python图像处理] 八.图像腐蚀与图像膨胀

    万次阅读 多人点赞 2018-10-31 15:11:11
    图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更...
  • 二值图像腐蚀与膨胀操作样例

    万次阅读 多人点赞 2017-06-26 23:59:26
    目录 操作方法简要说明 腐蚀操作 结构元素原点在结构元素内部 原点在结构元素外部 二值图像的膨胀操作 点在结构元素内部 原点在结构元素外部
  • 遥感图像预处理之图像拼接与裁剪

    万次阅读 多人点赞 2015-10-17 14:53:26
    遥感图像拼接与裁剪 一、试验目的:通过ENVI和ARCGIS软件对下载的大足地区的TM图像进行拼接和裁剪,将自己的家乡所在的区域裁剪出来。通过本次试验,初步熟悉ENVI和ARCGIS软件,为今后环境遥感学习奠定基础。 二、...
  • 本篇文章主要讲解Python调用OpenCV实现图像融合及加法运算,包括三部分知识:图像融合、图像加法运算、图像类型转换。全文均是基础知识,希望对您有所帮助。 1.图像加法运算 2.图像融合 3.图像类型转换
  • 十六、数字图像处理之图像分割

    万次阅读 多人点赞 2019-05-13 09:13:18
    图像分割(一)点、线和边缘检测(1)点检测(2)线检测(3)使用函数edge的边缘检测(二)使用霍夫变换的线检测(三)阈值处理(1)基础知识(2)基本全局阈值处理(3)使用Otsu's方法的最佳全局阈值处理(4)使用...
  • 如何学好图像处理——从小白到大神?

    万次阅读 多人点赞 2016-02-26 17:48:13
    什么是数字图像处理?历史、以及它所研究的内容。 说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。 ...
  • 图像处理 图像分析和图像理解

    万次阅读 2018-06-11 00:17:06
    图像处理:利用计算机对图像进行去除噪声、增强、复原、分割、特征提取、识别、等处理的理论、方法和技术。狭义的图像处理主要是对图像进行各种加工,以改变图像的视觉效果并为自动识别奠定基础,或对图像进行压缩...
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...
  • 该系列文章是讲解Python ...前面的第六篇文章讲解了图像缩放、图像旋转、图像翻转和图像平移的几何变换,本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实。基础性知识希望对您有所帮助。
  • Pix2Pix-基于GAN的图像翻译

    万次阅读 多人点赞 2017-12-16 16:49:21
    在这些图像之间的转换称之为图像翻译,是一个图像生成任务。 多年来,这些任务都需要用不同的模型去生成。在GAN出现之后,这些任务一下子都可以用同一种框架来解决。这个算法的名称叫做Pix2Pix,基于对抗神经网络...
  • 彩色图像,每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像与索引图像一样都...但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩...
  • 想不到,今天学习的竟然还是彩色图像与灰度图像的转换。经过前面的学习,你们和我一样,有没有掌握 2 种彩色图像转换成灰度图像的方式,2021年第一天在学习1种。 取经之旅第 8 天彩色图像转换为灰度图像伪彩色图像...
  • 2 全色图像、多光谱图像、高光谱图像 2.1 全色图像 2.2 多光谱图像 2.3 高光谱图像 参考资料 1 光谱分辨率、空间分辨率、时间分辨率 遥感(Remote Sensing),可以理解为遥远的感知。遥感技术利用搭载在遥感平台...
  • MATLAB画函数图像

    万次阅读 多人点赞 2019-04-19 15:56:34
    1 画图基础 (1)一元一次函数 x=0:0.1:1; y=x; plot(x,y); %图像见下图1 图1 ...
  • 图像中的掩膜(Mask)是什么

    万次阅读 多人点赞 2018-01-22 18:11:46
    图像处理中,经常会碰到掩膜(Mask)这个词。那么这个词到底是什么意思呢?下面来简单解释一下。 1.什么是掩膜 首先我们从物理的角度来看看mask到底是什么过程。 在半导体制造中,许多芯片工艺步骤采用光刻技术...
  • 图像去雾(二)Retinex图像增强算法

    万次阅读 热门讨论 2019-07-23 14:47:16
    前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强、图像去雾、彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解。 Retinex理论 Retinex理论始于Land和McCann于20世纪60年代作出的...
  • 图像处理:图像灰度化

    万次阅读 多人点赞 2019-06-18 16:42:06
    灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象...
  • 【OpenCV】图像几何变换:旋转,缩放,斜切

    万次阅读 多人点赞 2012-05-30 14:56:25
    几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标...
  • 彩色图像:每个像素由R、G、B三个分量表示,每个通道取值范围0~255。数据类型一般为8位无符号整形。 灰度图像:每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。 二值图像...
  • 数字图像处理Matlab

    万次阅读 多人点赞 2018-06-18 20:25:13
    (注:本文代码大部分可从《数字图像处理 第三版》中找到)使用软件:MATLAB R2018a学习前提:了解matlab的GUI界面的每个按钮参考资料:《数字图像处理 第三版》,CSDN博客使用初音图片P站画师uid:1589657。...
  • 图像增强

    万次阅读 多人点赞 2018-07-11 13:30:59
    我们还需要利用图像增强技术,对图像进行进一步处理,以得到更好的特征和视觉效果。 图像增强:  一般的图像增强方法根据增强处理过程所在的空间不同,可分为基于空域和频域的方法。基于空域的方法直接对图像进行...
  • 图像数据库

    万次阅读 多人点赞 2016-07-14 21:41:58
    ImageNet ...目前已经包含14197122张图像,是已知的最大的图像数据库。每年的ImageNet大赛更是魂萦梦牵着国内外各个名校和大型IT公司以及网络巨头的心。图像如下图所示,需要注册ImageNet帐号才可以下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 463,116
精华内容 185,246
关键字:

图像