zoukankan      html  css  js  c++  java
  • 图像油画

    原理:

    1、获取图像的灰度(gray)图片
    2、设计一个小方框(4x4 or 8x8 or 10x10等),统计每个小方框的像素值
    3、将0-255的灰度值划分成几个等级,并把第二步处理的结果映射到所设置的各个等级中,并计数
    4、找到每个方框中灰度等级最多的所有的像素,并且求取这些像素的均值
    5、用统计出来的平均值来替代原来的像素值

    import cv2
    import numpy as np

    img = cv2.imread('D:/pythonob/imageinpaint/img/zidan.jpg', 1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dst = np.zeros((height, width, 3), np.uint8)
    pixel_class = 4
    section = int(256 / pixel_class)
    # 用两层for循环来遍历图片的每个数据
    for i in range(3, height - 3):
    for j in range(3, width - 3):
    # 当前程序中定义的灰度等级是4个
    # 定义一个数组来装载这4个等级内的像素个数
    array1 = np.zeros(pixel_class, np.uint8)
    # 当前程序中定义的小方块是6x6的
    for m in range(-3, 3):
    for n in range(-3, 3):
    # p1是对该像素点等级段的划分,用下标表示0-3
    p1 = int(gray[i + m, j + n] / section)
    # 接下来对像素等级进行计数,array1的下标代表像素等级,
    # 值则代表处在该像素等级小方框内像素的个数
    array1[p1] = array1[p1] + 1
    # 接下来判断在这个小方框内哪一个像素段的像素最多
    currentMax = array1[0]
    l = 0 # 这里设置一个l用来记录像素段计数最多的数组下标
    for k in range(0, pixel_class):
    if currentMax < array1[k]:
    currentMax = array1[k]
    l = k
    # 均值处理
    u = v = w = 0
    for m in range(-3, 3):
    for n in range(-3, 3):
    if gray[i + m, j + n] >= (l * section) and gray[i + m, j + n] <= ((l + 1) * section):
    (b, g, r) = img[i + m, j + n]
    u += b
    v += g
    w += r
    u = int(u / array1[l])
    v = int(v / array1[l])
    w = int(w / array1[l])
    dst[i, j] = [u, v, w]
    cv2.imshow('dst', dst)
    cv2.imshow('img', img)
    cv2.waitKey(0)

    效果图;

  • 相关阅读:
    无废话设计模式(7)结构型模式--装饰模式
    无废话设计模式(6) 结构型模式--适配器模式
    无废话设计模式(5)结构型模式--桥接模式
    无废话设计模式(4)原型模式
    Java进阶--Map集合
    Java进阶--List接口
    Java进阶--集合泛型综合应用案例(斗地主)
    Java进阶--泛型
    Java进阶--Iterator迭代器
    Java进阶--Collection集合
  • 原文地址:https://www.cnblogs.com/cxxBoo/p/11460215.html
Copyright © 2011-2022 走看看