图像的基本操作--反转、放大等
1.打开图像
import os
import matplotlib.image as mpimg
import numpy as np
import matplotlib.pyplot as plt #显示照片
from PIL import Imagecwd = os.getcwd() # 获得当前工作路径
print(cwd)
path = cwd + "/images"
valid_exts = [".jpg", ".gif", ".png", ".tga", ".jpeg"]print('%d files in %s'%(len(os.listdir(path)), path))imgs =[]
names =[]
for f in os.listdir(path):ext = os.path.splitext(f)[1] #ext:('1', '.jpg') ext[1]: .jpgif ext.lower() not in valid_exts :continuefullpath = os.path.join(path, f)imgs.append(mpimg.imread(fullpath))names.append(os.path.splitext(f)[0]+os.path.splitext(f)[1])print('%d images loaded'%(len(imgs)))nimgs = len (imgs)
randidx = np.sort(np.random.randint(nimgs, size=3))
print(randidx)print('Type of imgs :', type(imgs))
print('Length of imgs :', len(imgs))for curr_img, curr_name, i in zip([imgs[j] for j in randidx], [names[j] for j in randidx], range(len(randidx))):print('[%d] Type of curr_img: %s'%(i, type(curr_img)))print('Name is :%s'%(curr_name))print('size of curr_img: %s '%(curr_img.shape,)) # ,逗号
import matplotlib.image as mpimg
mpimg.imread()
可以用 im.shape
from PIL import Image
利用Image
valid_exts1=["jpg", "gif", "png", "tga", "jpeg"]
ims = input('请输入文件名:')
print(ims.split('.', 1)[1])
while ims.split('.', 1)[1] in valid_exts1:im = mpimg.imread(os.path.join(path, ims ))plt.imshow(im)print(im.shape)plt.show()break
2. 旋转(PIL)
#旋转
im = Image.open(os.path.join(path, ims ))
angle = int(input('请输入旋转角度:'))
im_rotate = im.rotate(angle=angle)
im_rotate.show()
plt.imshow(im_rotate)
plt.show()
3.缩放
p = float(input('请输入缩放比例(0-1):'))
(x, y) = im.size
x_s = x *p
y_s = y *p
out = im.resize((x_s, y_s), Image.ANTIALIAS)
out.show()
#im_resize = im.resize((128, 128)) 直接输入所需的大小
补充:os.walk()用类似于深度遍历的方式遍历文件夹中的子文件夹以及文件。最基本的显示方式为(root_path,[file_dirs],[files]),以元组为单位区分每一层的,每一层又分成三个部分根目录路径、本目录中文件夹名字、本目录中文件名字。
for root, dirs, files in os.walk(image_path):
print("root:"+root)
print(dirs)
print(files)
4.水平反转
out1 = im.transpose(Image.FLIP_LEFT_RIGHT) # 实现翻转
out1.show()
5.上下反转
out2 = im.transpose(Image.FLIP_TOP_BOTTOM) #上下反转out2.show()
6.提取轮廓
cv2.imread()-----opencv读取图像为b,g,r方法
灰度化与二值化的区别
灰度化:在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般常用的是加权平均法来获取每个像素点的灰度值。
二值化:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果
img = cv2.imread(r'F:\pytorch Tutorial\study\images\1.jpg')
cv2.imshow('Example',img)
cv2.waitKey(0)gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化
cv2.imshow('Example1',gray_img)
cv2.waitKey(0)#二值化
def get_binary_img(img):# gray img to bin imagebin_img = np.zeros(shape=(img.shape), dtype=np.uint8)h = img.shape[0]w = img.shape[1]for i in range(h):for j in range(w):bin_img[i][j] = 255 if img[i][j] > 127 else 0return bin_img
# 调用
bin_img = get_binary_img(gray_img)cv2.imshow('Example2',bin_img )
cv2.waitKey(0)def get_contour(bin_img):# get contourcontour_img = np.zeros(shape=(bin_img.shape),dtype=np.uint8)contour_img += 255h = bin_img.shape[0]w = bin_img.shape[1]for i in range(1,h-1):for j in range(1,w-1):if(bin_img[i][j]==0):contour_img[i][j] = 0sum = 0sum += bin_img[i - 1][j + 1] #判断此像素点附近八个点的值是否为0sum += bin_img[i][j + 1]sum += bin_img[i + 1][j + 1]sum += bin_img[i - 1][j]sum += bin_img[i + 1][j]sum += bin_img[i - 1][j - 1]sum += bin_img[i][j - 1]sum += bin_img[i + 1][j - 1]if sum == 0:contour_img[i][j] = 255return contour_img
# 调用
contour_img = get_contour(bin_img)cv2.imshow('Example3',contour_img)
cv2.waitKey(0)
7.灰度图反相处理
#反相处理
#(x_1,y_1)=gray_img.sizeimg = cv2.imread(r'F:\pytorch Tutorial\study\images\1.jpg')
cv2.imshow('Example',img)
cv2.waitKey(0)gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化
cv2.imshow('Example1',gray_img)
cv2.waitKey(0)
a=np.ones_like(gray_img, dtype=np.int32) *255
b = a- gray_img
plt.imshow(b,cmap='gray')
plt.show()
8.python直方图均衡化
直方图均衡化就是把一已知灰度概率分布的图像经过一种变换使之演变成一幅具有均匀灰度概率分布的新图像
灰度处理
问题1:如何计算直方图?
对于8位灰度图来说,颜色有256级,统计每级的个数,然后把结果用图表表示出来就可以了
import cv2
import matplotlib.pyplot as plt
import numpy as np
import osgray_level = 256def piexl_im(img):assert isinstance(img, np.ndarray)(height, width) = img.shapeprob = np.zeros(shape=(256))for i in range(height):for j in range(width):k = img[i,j] # 一点的像素值prob[k] = prob[k]+1return probdef piexl_prob(img):assert isinstance(img, np.ndarray)(height, width) = img.shapeprob = np.zeros(shape=(256))for i in range(height):for j in range(width):k = img[i,j] # 一点的像素值prob[k] = prob[k]+1prob= prob/(height * width)return probimg = cv2.imread('1.jpg')
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化x=piexl_im(gray_img)a= range(256)
plt.bar(a, x,width=0.2)
plt.show()probably = piexl_prob(gray_img)def probability_to_histogram(img, prob):prob = np.cumsum(prob) # 累计概率img_map = [int(255 * prob[i] + 0.5) for i in range(256)] # 像素值映射# 像素值替换assert isinstance(img, np.ndarray)r, c = img.shapefor ri in range(r):for ci in range(c):img[ri, ci] = img_map[img[ri, ci]]return imgdef plot(y, name):"""画直方图,len(y)==gray_level:param y: 概率值:param name::return:"""plt.figure(num=name)plt.bar([i for i in range(gray_level)], y, width=1)img = cv2.imread("1.jpg", 0) # 读取灰度图prob = piexl_prob(img)
plot(prob, "原图直方图")# 直方图均衡化
img = probability_to_histogram(img, prob)
cv2.imwrite("source_hist.jpg", img) # 保存图像prob = piexl_prob(img)
plot(prob, "直方图均衡化结果")plt.show()
补充: cumsum()
9.均值滤波、高斯滤波
cv.blur( 图像, (核3,3))------》改变核的大小可以改变滤波强度
高斯滤波
#自定义均值滤波def mean_blur(img,kernel_size=3):h, w, c = img.shape#零填充k = kernel_size//2a = np.zeros((h + 2*k,w + 2*k,c),dtype=np.float)a[k:k + h, k:k + w] = img.copy().astype(np.float)#卷积temp= a.copy()for y in range(h):for x in range(w):for ci in range(c):a[k+y,k+x,ci]=np.mean(temp[y:y+kernel_size,x:x+kernel_size,ci])out = a[k:k + h, k:k + w].astype(np.uint8)return out
#自定义高斯滤波
def gaussian_filter(img, K_size=3, sigma=1.3):if len(img.shape) == 3:H, W, C = img.shapeelse:img = np.expand_dims(img, axis=-1)H, W, C = img.shape## Zero paddingpad = K_size // 2out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)## prepare KernelK = np.zeros((K_size, K_size), dtype=np.float)for x in range(-pad, -pad + K_size):for y in range(-pad, -pad + K_size):K[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2) / (2 * (sigma ** 2)))K /= (2 * np.pi * sigma * sigma)K /= K.sum()tmp = out.copy()# filteringfor y in range(H):for x in range(W):for c in range(C):out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])out = np.clip(out, 0, 255)out = out[pad: pad + H, pad: pad + W].astype(np.uint8)return out
参考文献:
Python中读取图片的6种方式_Python_脚本之家
实例说明图像的灰度化和二值化的区别 - 云+社区 - 腾讯云
【深度好文】Python图像处理之目标物体轮廓提取_sgzqc的专栏-CSDN博客 Opencv-python(cv2)图像读取、显示与保存,看这一篇就够了_风雪夜归人o的博客-CSDN博客
数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)_TechArtisan6的博客-CSDN博客
手动实现均值滤波(python)_陨星落云的博客-CSDN博客_均值滤波python
高斯滤波详解 python实现高斯滤波_Ibelievesunshine的博客-CSDN博客
(29条消息) 【图像处理算法】直方图均衡化_GQ-CSDN博客_直方图均衡化
(29条消息) 直方图均衡化-python实现_lsh呵呵-CSDN博客_python直方图均衡化
图像的基本操作--反转、放大等相关推荐
- matlab中的图像,MATLAB中图像的基本操作
MATLAB中图像的基本操作 1.读取.显示图片 MATLAB中提供了immread()与imshow()函数读取和显示图片.其中读取函数imread()原型: imread: A= imread(f ...
- Python练习 | Python之图像的基本操作和处理
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ***************** ...
- python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算
图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...
- 【学习OpenCV4】图像的基本操作
图像的基本操作 一.图像色彩空间转换 1.1 基本知识 1.2 创建类 1.3 编写主函数 1.4 测试结果 二.图像对象的创建与复制 2.1 什么是Mat 2.2 创建空白图像 2.3 图像的复制 ...
- opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
0.序言 每个图像是由一个个点组成的,而这些点可以表示为像素值的形式. 这篇博客里我们将学会: 访问像素值并修改它们 . 访问图像属性 . 设置感兴趣区域(ROI) . 分割和合并图像. 对于图像的基 ...
- Opencv-Python学习(一)———图像的基本操作
目录 一.Opencv简介 二.安装Opencv 三.Opencv图像的基本操作 一.Opencv简介 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以 ...
- 【opencv学习笔记】003之图像像素基本操作(获取像素指针、范围处理)及掩膜操作(filter2D)详解
目录 一.前言 二.图像像素基本操作 1.获取图像像素指针 1.获取图像像素指针是什么? 2.相应API 3.获取目的 2.像素范围处理saturate_cast 1.像素范围处理是什么? 2.像素范 ...
- matlab 图像上下翻,Matlab图像九宫格基本操作(翻转,镜像等)+位图操作
Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 这次blog提到的操作对于matlab来说都很基础,而且对于有编程和计算机基础的人来 ...
- 数字图像处理实验--实验项目一 图像的基本操作和基本运算
目录 前言 实验项目一 图像的基本操作和基本运算 1.[图像的读取操作] 2 [图像的基本运算] 3[ 图像的几何变换] 4[图像的灰度变换] 前言 数字图像处理(Digital Image Proc ...
最新文章
- 线性时间选择问题——分治
- python学习笔记项目_python学习笔记——肆
- 玩法与叙事撕裂许久,3A与暴力却难分难舍
- Controlling Execution
- IDEA---SpringBoot同一个项目多端口启动
- jQuery: jscolor - color picker
- 命令行请求网站地址带token_利用gitlab或gitee作为网站免费图床的C#实现
- ssh连接虚拟机的linux_openstack系列之运维排障:虚拟机SSH连接失败
- 【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
- 0405_hxtx_主题游常用联系人功能代码实现
- 腾讯校园招聘笔试 2019-8-17 第五题
- 如何利用情感词典做中文文本的情感分析?
- 配电网自动化课程复习总结
- 2021年山东省安全员C证最新解析及山东省安全员C证证考试
- windows事件查看器
- 华乾服显示无法连接服务器,唯满侠战火纷飞,飞龙休闲养老,剑网三各服务器缘何天差地别...
- Win7下硬盘安装Ubuntu12.04双系统
- android常用api大全,Android相关常用API……
- 解决电脑开机黑屏只有鼠标的问题
- 2023年浙江大学报考点硕士研究生报名网上确认公告