opencv—图像增强处理1

数据增强的方法很多,有加噪声、旋转、改变饱和度、亮度、对比度、锐度等;可以单一改变一个参数,也可以进行混合调节。
以下一一介绍几种方法:
代码0:随机裁剪

def random_crop(file,save_path,num):
    img = cv2.imread(path+file)
    img = cv2.resize(img, (240,240), interpolation=cv2.INTER_AREA)

    upper_x = random.randint(0,8)
    dowm_x =upper_x+224
    upper_y = random.randint(0,8)
    dowm_y = upper_y+224
    img2 = img[upper_x:dowm_x,upper_y:dowm_y]

    cv2.imwrite(save_path+file,img2)
    # cv2.imshow('img1',img)
    # cv2.imshow('img2',img2)
    # cv2.waitKey(0)

代码1:改变hsv

def randomHueSaturationValue(image, hue_shift_limit=(-2,8),sat_shift_limit=(-5,50),val_shift_limit=(0,1.5)):
    img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    h, s ,v = img[:,:,0],img[:,:,1],img[:,:,2]
    hue_shift = np.random.uniform(hue_shift_limit[0], hue_shift_limit[1])

     # h= v + val_sh = h + hue_shift

    sat_shift = np.random.uniform(sat_shift_limit[0], sat_shift_limit[1])
    s = s + sat_shift

    val_shift = np.random.uniform(val_shift_limit[0], val_shift_limit[1])
    vhift
    
    img[:,:,0],img[:,:,1],img[:,:,2] = h, s ,v
    image = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)

    # cv2.imshow("a1.jpg",image)
    cv2.imwrite("img2/a"+str(i)+".jpg",image)

代码2:加随机高斯噪声

def noise():
    coutn = 30
    for k in range(0, coutn):
        xi = int(np.random.uniform(0, img_data.shape[1]))
        xj = int(np.random.uniform(0, img_data.shape[0]))
        if img_data.ndim == 2:
            img_data[xj, xi] = 0
        elif img_data.ndim == 3:
            param = 30
            r1 = np.random.random_sample()
            r2 = np.random.random_sample()
            z1 = param * np.cos(2 * np.pi * r2) * np.sqrt((-2) * np.log(r1))
            z2 = param * np.sin(2 * np.pi * r2) * np.sqrt((-2) * np.log(r1))

            img_data[xj, xi, 0] = img_data[xj, xi, 0] + z1
            img_data[xj, xi, 1] = img_data[xj, xi, 1] + z1 / 2 + z2 / 2
            img_data[xj, xi, 2] = img_data[xj, xi, 2] + z2

            if img_data[xj, xi, 0] < 0:
                img_data[xj, xi, 0] = 0
            elif img_data[xj, xi, 0] > 255:
                img_data[xj, xi, 0] = 255

            if img_data[xj, xi, 1] < 0:
                img_data[xj, xi, 1] = 0
            elif img_data[xj, xi, 1] > 255:
                img_data[xj, xi, 1] = 255

            if img_data[xj, xi, 2] < 0:
                img_data[xj, xi, 2] = 0
            elif img_data[xj, xi, 2] > 255:
                img_data[xj, xi, 2] = 255

    cv2.imwrite(file_path + '-noise-' +str(n)+ '.bmp', img_data)

代码3:图片旋转

import cv2
import numpy as np
import random
import os


def rotate1(image, angle, scale=1):
    # if (count%2==0):
    w = image.shape[1]
    h = image.shape[0]
    M = cv2.getRotationMatrix2D((w/2,h/2), angle, scale)

    dst = cv2.warpAffine(image,M,(w,h))   #borderValue=(255,255,255)消除黑边
    cv2.imwrite(save_path+'-rotate-90'+'.jpg',dst)


def rotate2(image, angle, scale=1):
    w = image.shape[1]
    h = image.shape[0]
    M = cv2.getRotationMatrix2D((w/2,h/2), angle, scale)

    dst = cv2.warpAffine(image,M,(w,h))
    cv2.imwrite(save_path+'-rotate-2.jpg',dst)



n=0
path = "D:/work/Test/Test1/test8--数据增强--cv/data/3_mole/"  # 文件夹目录
files = os.listdir(path)  # 得到文件夹下的所有文件名称
for file in files:  # 遍历文件夹
    if file.endswith('.jpg'):
        if not os.path.isdir(file):  # 判断是否是文件夹,不是文件夹才打开
            img = cv2.imread(path + "/" + file,1)   # 打开文件
            n=n+1
            print(file)
            #分离文件后缀,提取文件名,保存到新路径
            save_name=os.path.splitext(file)[0]
            save_path="D:/work/Test/Test1/test8--数据增强--cv/data/3_mole/270/"+save_name
            
            #1.固定旋转
            # a=90
            # rotate1(img,a)
            # b=-6
            # rotate2(img,b)

            # for n in range(1,3):
                # #2.1随机旋转固定值
                # list=[6,-6]
                # a=random.sample(list, 1)[0]
                # rotate1(img1,a)

                # #2.1随机旋转范围值
                # a=random.randint(-180,180)
                # rotate1(img1, a)

另外介绍下旋转后无黑边的方法:
ng = im.transpose(img.ROTATE_90)
ng2 = im.transpose(img.ROTATE_180)
ng3 = im.transpose(img.ROTATE_270)


代码4:饱和度、亮度、对比度、锐度—单一参数调节

def randomColor(root_path,img_name): #随机颜色
    # if (count%2==0):
    # #1、调整图像的饱和度
    # random_factor = np.random.uniform(0.9,1.3)  # 随机因子
    # color_image = ImageEnhance.Color(image).enhance(random_factor)
    # color_image.save(save_path+'-saturation-'+str(n)+'.jpg')

    # if (count%2==1):
    # # 2、调整图像的亮度
    # random_factor = np.random.uniform(0.9,1.2)  # 随机因子
    # brightness_image = ImageEnhance.Brightness(image).enhance(random_factor)
    # # brightness_image.save(save_path)
    # brightness_image.save(save_path+'-bright-'+str(n)+'.jpg')

    # # if (count % 2 == 1):
    # # 3、调整图像对比度
    # random_factor = np.random.uniform(0.9,1.3)  # 随机因子
    # contrast_image = ImageEnhance.Contrast(image).enhance(random_factor)
    # contrast_image.save(save_path+'-contrast-'+str(n)+'.jpg')
    #
    # # if (count % 2==1):
    # 4、调整图像锐度
    random_factor = np.random.uniform(-3,3)  # 随机因子
    Sharpness_image=ImageEnhance.Sharpness(image).enhance(random_factor)
    Sharpness_image.save(save_path+'-Sharpness-'+str(n)+'.jpg')

代码5:饱和度、亮度、对比度、锐度—混合调节

import numpy as np
import skimage
import io,os
import cv2
import matplotlib.pyplot as plt
from PIL import Image,ImageEnhance
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

def randomColor(root_path,img_name): #随机颜色
    
    # 1、调整图像的饱和度
    random_factor = np.random.uniform(0.9,1.3)  # 随机因子
    color_image = ImageEnhance.Color(image).enhance(random_factor)


    # 2、调整图像的亮度
    random_factor = np.random.uniform(0.9,1.2)  # 随机因子
    brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)


    # # 3、调整图像对比度
    # random_factor = np.random.uniform(0.8,1.3)  # 随机因子
    # contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)

    # 4、调整图像锐度
    random_factor = np.random.uniform(-3,3)  # 随机因子
    mix_image = ImageEnhance.Sharpness(brightness_image).enhance(random_factor)

    mix_image.save(save_path + '-mix-' + str(n) + '.jpg')


if __name__ == '__main__':
    root_path = "J:/TF6/tf6-data-clear/45"  # 文件夹目录
    files = os.listdir(root_path)  # 得到文件夹下的所有文件名称
    for file in files:  # 遍历文件夹
        if file.endswith('jpg'):
            if not os.path.isdir(file):  # 判断是否是文件夹,不是文件夹才打开
                image = Image.open(os.path.join(root_path, file))

                #提取文件名,保存到新路径
                save_name=os.path.splitext(file)[0]
                save_path='J:/TF6/tf6-data-add/451/'+save_name

                for n in range(1,2):
                    randomColor(root_path,file)

随机选择增强方式:

# -*- coding: utf-8 -*-
import  random
import os
import numpy as np
import skimage
import matplotlib.pyplot as plt
from PIL import Image,ImageEnhance
import cv2
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
import io,os

# 随机裁剪
def random_crop(img):
    img = cv2.resize(img, (240,240), interpolation=cv2.INTER_AREA)

    upper_x = random.randint(0,8)
    dowm_x =upper_x+224
    upper_y = random.randint(0,8)
    dowm_y = upper_y+224
    img2 = img[upper_x:dowm_x,upper_y:dowm_y]

    return img2


def random_enhance(path,file,save_path,num): #随机颜色
    img = cv2.imread(path+file)
    image = Image.open(path+file)
    file_name=file.split('.jpg')[0]

    if (num==0):
        #1、调整图像的饱和度
        random_factor = np.random.uniform(1,1)  # 随机因子
        images = ImageEnhance.Color(image).enhance(random_factor)

        # images.save(save_path+file_name+'-saturation.jpg')
        return images

    if (num==1):
        # 2、调整图像的亮度
        random_factor = np.random.uniform(0.9,1.2)  # 随机因子
        images = ImageEnhance.Brightness(image).enhance(random_factor)
        
        # images.save(save_path+file_name+'-bright.jpg')
        return images

    if (num==2):
        # 3、调整图像对比度
        random_factor = np.random.uniform(0.9,1.3)  # 随机因子
        images = ImageEnhance.Contrast(image).enhance(random_factor)

        # images.save(save_path+file_name+'-contrast.jpg')
        return images
        
    if (num==3):
        # 4、调整图像锐度
        random_factor = np.random.uniform(-3,3)  # 随机因子
        images=ImageEnhance.Sharpness(image).enhance(random_factor)

        # images.save(save_path+file_name+'-Sharpness.jpg')
        return images

    if (num==4):
        # 5.随机裁剪
        images=random_crop(img)

        # cv2.imwrite(save_path+file_name+'-crop.jpg',images)
        return images

    if(num==5):
        images=cv2.flip(img, 1)   #1:水平翻转  0:垂直翻转  -1:水平垂直翻转

        # cv2.imwrite(save_path+file_name+'-flip.jpg',images)
        return images


path='img/'
save_path = 'img2/'
for file in os.listdir(path):
    num=random.randint(0,5)
    output=random_enhance(path,file,save_path,5)
    print(file+'---'+str(num))

    # cv2.imshow('img1',output)
    # cv2.waitKey(0)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值