【opencv】学习笔记--图像简单操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


图像简单操作:

(1)读取、放大

任务

(1)将其分辨率放大至原来的二倍
(2)将其分辨率修改为
分别在窗口显示
分别保存为新图像

code


#read img“baby”
img = cv.imread("D:/lab/opencv/data/baby.png")
#放大分辨率
img_enlarge = cv.resize(img, None, None, fx=2, fy=2, interpolation=cv.INTER_LINEAR)
#修改分辨率
img_resize = cv.resize(img, (300, 300), interpolation=cv.INTER_LINEAR)

#显示图像
cv.imshow("baby", img)
cv.waitKey(0) # 即当前窗口持续显示,直至按下键盘或者点击窗口关闭
cv.imshow("enlarge", img_enlarge)
cv.waitKey(0)
cv.imshow("resize", img_resize)
cv.waitKey(0)

#save img
save_path = 'D:/lab/opencv/result'
if not os.path.exists(save_path):
    os.makedirs(save_path)
cv.imwrite(os.path.join(save_path, 'baby_enlarge.png'), img_enlarge)
cv.imwrite(os.path.join(save_path, 'baby_resize.png'), img_resize)

#按下任意键退出
cv.destroyAllWindows()

(2)高斯、旋转

任务

对butterfly图像加入size=7的高斯模糊
再将图像顺时针旋转90度

code

def Gauss(img):
    gauss = cv.GaussianBlur(img, (0,0), 7)
    return gauss

# 顺时针旋转90度
def RotateClockWise90(img):
    rotation = cv.rotate(img, 0) # 0表示90度,1表示180度,2表示270度
    return  rotation

if __name__ == '__main__':

    # img = cv.imread("D:/lab/opencv/data/butterfly.png")
    # img_gauss = Gauss(img)
    # img_rotation = RotateClockWise90(img_gauss)
    # #show
    # cv.imshow("gauss", img_gauss)
    # cv.waitKey(0)
    # cv.imshow("rotation", img_rotation)
    # cv.waitKey(0)

(3)批量转化

任务

将cam文件夹下jpg图像批量转为png
并将新png图像命名为
“原名_0_LQRnb.png”
“原名_1_LQRnb.png”
“原名_2_LQRnb.png”
“原名_3_LQRnb.png”

code

#turn jpg into png
def JPG2PNG(path):
    img_pathDir = os.listdir(path) # 提取所有文件名,并存在列表中
    for i in range(len(img_pathDir)):
        img_name = img_pathDir[i] # 读取所有文件名
        img_path_name = path + img_name  # 变量储存:绝对路径+文件名+拓展名

        if img_name.endswith('.jpg'):
            img = cv.imread(img_path_name)
            new_img = img_name.split(".")[0] + str(i) + '_LQRnb.png'
            print(new_img)
            cv.imwrite(path + new_img, img)

效果

在这里插入图片描述

(4)色彩空间转化、增强

任务

将彩色图像lenna变为黑白图(只保留亮度信号)
将亮度值提升为原来的10%(注意亮度值会溢出!)
保存图像
【思考:选择合适的色彩空间以便于对图像的处理,6同】

code


def read_path(file_pathname):
    # 遍历该目录下的所有图片文件
    for filename in os.listdir(file_pathname):
        img_pat = "./" + file_pathname + "/" + filename  # 图片地址
        img = cv.imread(img_pat)  # 读图片
        imgBrightness(img, 0.8, 3, filename)
        # img = cv2.imread(file_pathname+'/'+filename)
        # img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 三通道转灰度图
        # img = cv2.cvtColor(filename, cv2.COLOR_GRAY2BGR)  # 灰度图转三通道

def rgb2gray(path):
    img = cv.imread(path)
    row, col, channel = img.shape # 行数(高度)、列数(宽度)、通道数
    img_gray = np.zeros((row, col))

    #亮度转换,I(x,y) = 0.3 * I_R(x,y) +0.59 * I_G(x,y)+ 0.11 * I_B(x,y)
    for r in range(row):
        for l in range(col):
            img_gray[r, l] = 0.11 * img[r, l, 0] + 0.59 * img[r, l, 1] + 0.3 * img[r, l, 2]

    # 读取灰度图像
    img2 = cv.imread(path, flags=0)

    cv.imshow("lenna_weighted", img_gray.astype("uint8"))
    cv.waitKey()

    cv.imshow("lenna_gray", img2.astype("uint8"))
    cv.waitKey()
    cv.destroyAllWindows()

def imgBrightness(img, l):

    # h, w, ch = img.shape
    # black = np.zeros([h, w, ch], img.dtype) # 返回来一个给定形状和类型的用0填充的数组
    #
    # rst = cv.addWeighted(img, l, black, 1 - l, 0) # 图像融合
    # # 第二个参数调节亮度,越大越亮,越小越暗
    # # gamma: 灰度系数,图像校正的偏移量,用于调节亮度,一半为0
    # # 变暗:rst = contrast_img(img, 0.5, 3)
    # # cv.imwrite('save' + "/" + filename, rst)  # 保存图片
    # cv.imshow('raw', img)
    # cv.imshow('black', black)
    # cv.imshow('bright_lenna', rst)
    # cv.waitKey()
    # return rst

    ###用HLS颜色空间更好
    # Convert BGR to HLS
    imgHLS = cv.cvtColor(img, cv.COLOR_BGR2HLS)
    cv.imshow('lenna', imgHLS)
    cv.imshow('row', img)
    img_lighter = np.copy(imgHLS)
    img_lighter[:, :, 1] = (1.0 + l) * imgHLS[:, :, 1]
    img_lighter[:, :, 1][img_lighter[:, :, 1] > 255] = 255
    # range of white color in L channel
    # mask = cv2.inRange(imgHLS[:,:,1], lowerb=250, upperb=255)
    img1 = cv.cvtColor(img_lighter, cv.COLOR_HLS2BGR)
    cv.imshow('row1', img1)
    #print(img_lighter[:, :, 1])
    cv.imshow('lenna', imgHLS)
    cv.imshow('bright_lenna', img_lighter)
    cv.waitKey()

效果

在这里插入图片描述在这里插入图片描述
(1)溢出
img_lighter[:, :, 1][img_lighter[:, :, 1] > 255] = 255
这句已经没有用了
(2)要转化为bgr才能imshow

(5)对数据集进行增强扩充

任务

将dataset中图像数按以下方法扩充至原来的6倍,形成新的数据集
(1)亮度在[80%,120%]范围内随机改变
(2)饱和度在[90%, 110%]范围内随机改变
(3)色度在[-10°,+10°]范围内随机改变
(4)引入高斯模糊,size在{5,7,9,11}种随机选择
(5)在图像随机位置加入随机大小的黑色遮罩,要求遮罩范围不大于整个图像的30%
(注意命名不限,但要合理)

code

####亮度在[80%,120%]范围内随机改变
def random_change_light(img, img_name, save_path, a):

    # Convert BGR to HLS
    imgHLS = cv.cvtColor(img, cv.COLOR_BGR2HLS)
    img_lighter = np.copy(imgHLS)
    l = random.uniform(-0.2, 0.2) # 用于生成一个指定范围内的小数。 m <= l <= n

    if (1.0 + 0.2) * imgHLS[:, :, 1].any() >255:
        img_lighter[:, :, 1] = 255
    else:
        img_lighter[:, :, 1] = cv.multiply((1.0 + l), imgHLS[:, :, 1])

    # Convert HLS to BGR
    img1 = cv.cvtColor(img_lighter, cv.COLOR_HLS2BGR)

    #save img
    new_img = img_name.split(".")[0] + str(a+1) + '_light_change.png'
    print(new_img)
    cv.imwrite(save_path + new_img, img1)

def random_change_saturation(path):
    pass
def random_change_hue(path):
    pass

####引入高斯模糊,size在{5,7,9,11}种随机选择
def random_change_gauss(img, img_name, save_path, a):

    size = random.choice((5, 7, 9, 11))
    img_gauss = np.copy(img)
    gauss = cv.GaussianBlur(img_gauss, (0,0), size)

    # save img
    new_img = img_name.split(".")[0] + str(a+1) + '_gauss_change.png'
    print(new_img)
    cv.imwrite(save_path + new_img, gauss)

####在图像随机位置加入随机大小的黑色遮罩,要求遮罩范围不大于整个图像的30%
def random_change_black_mask(img, img_name, save_path, a):

    #生成遮罩
    x = random.randint(0, img.shape[1]) #图像宽度
    y = random.randint(0, img.shape[0]) #图像高度
    w = random.randint(0, img.shape[1] - x) #图像宽度
    h = random.randint(0, img.shape[0] - y) #图像高度
    print('img:',x,w,img.shape[1],'-',y, h, img.shape[0])

    mask = np.zeros([img.shape[0], img.shape[1]], dtype=np.uint8)
    img_size = img.shape[1]*img.shape[0]
    mask_size = w*h
    print(img_size,mask_size)
    if mask_size < 0.3*img_size:
        for i in range(0, img.shape[0]):
            for j in range(0, img.shape[1]):
                if i in range(x,x+w) and j in range(y,y+h):
                    gray = 0
                else:
                    gray = 255 # 数组元素是255,生成白色的图片
                mask[i, j] = np.uint8(gray)
    else:
        random_change_black_mask(img, img_name, save_path, a)

    #图像拼接
    img_mask = cv.add(img, np.zeros(np.shape(img), dtype=np.uint8), mask=mask)

    # save img
    new_img = img_name.split(".")[0] + str(a+1) + '_mask_change.png'
    print(new_img)
    cv.imwrite(save_path + new_img, img_mask)

####查看图像任意一点bgr值
def mouse_click(event, x, y, flags, para):

    # if event == cv.EVENT_LBUTTONDOWN:  # 左边鼠标点击
    #     print('PIX:', x, y)
    #     print("BGR:", img[y, x])
    #     print("GRAY:", gray[y, x])
    #     print("HLS:", hls[y, x])
    pass

if __name__ == '__main__':

    file_pathname = "D:/lab/opencv/data/dataset/"
    save_path = "D:/lab/opencv/data/dataset/mask_change/"
    #读取所有图片
    for filename in os.listdir(file_pathname):
        if filename.endswith('.png'):
            img_pat = file_pathname + "/" + filename  # 图片地址
            img = cv.imread(img_pat)  # 读图片
            for i in range(0, 3):
                # random_change_light(img, filename, save_path, i)
                # random_change_gauss(img, filename, save_path, i)
                #random_change_black_mask(img, filename, save_path, i)
                i += 1

    ####查看图像任意一点bgr值
    # img = cv.imread('D:/lab/opencv/data/dataset/00000000_SR.png')
    # gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # hls = cv.cvtColor(img, cv.COLOR_BGR2HLS)
    # cv.namedWindow("img")
    # cv.setMouseCallback("img", mouse_click)
    # cv.imshow('img', img)
    # cv.waitKey()
    # cv.destroyAllWindows()

效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值