在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有以下四种方法对彩色图像进行灰度化:
1分量法
将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
f1(i,j)=R(i,j)
f2(i,j)=G(i,j)
f3(i,j)=B(i,j)
其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。
2最大值法
将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
f(i,j)=max(R(i,j),G(i,j),B(i,j))
3平均值法
将彩色图像中的三分量亮度求平均得到一个灰度图。
f(i,j)=(R(i,j)+G(i,j)+B(i,j))
/3
4加权平均法
根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。
f(i,j)=030R(i,j)+059G(i,j)+011B(i,j))
import CV2
import copy
import numpy as np
import random
使用的是pycharm
因为最近看了《银翼杀手2049》,里面Joi实在是太好看了所以原图像就用Joi了
要求是灰度图像,所以第一步先把图像转化成灰度图像
# 读入原始图像
img = CV2imread('joijpg')
# 灰度化处理
gray = CV2cvtColor(img, CV2COLOR_BGR2GRAY)
CV2imwrite('imgpng', gray)
第一个任务是利用分段函数增强灰度对比,我自己随便写了个函数大致是这样的
def chng(a):
if a < 255/3:
b = a/2
elif a < 255/32:
b = (a-255/3)2 + 255/6
else:
b = (a-255/32)/2 + 255/6 +255/32
return b
rows = imgshape[0]
cols = imgshape[1]
cover = copydeepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2imwrite('coverpng', cover)
下一步是直方图均衡化
# histogram equalization
def hist_equal(img, z_max=255):
H, W = imgshape
# S is the total of pixels
S = H W 1
out = imgcopy()
sum_h = 0
for i in range(1, 255):
ind = npwhere(img == i)
sum_h += len(img[ind])
z_prime = z_max / S sum_h
out[ind] = z_prime
out = outastype(npuint8)
return out
covereq = hist_equal(cover)
CV2imwrite('covereqpng', covereq)
在实现滤波之前先添加高斯噪声和椒盐噪声(代码来源于网络)
不知道这个椒盐噪声的名字是谁起的感觉隔壁小孩都馋哭了
用到了randomgauss()
percentage是噪声占比
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetagesrcshape[0]srcshape[1])
for i in range(NoiseNum):
randX=randomrandint(0,srcshape[0]-1)
randY=randomrandint(0,srcshape[1]-1)
NoiseImg[randX, randY]=NoiseImg[randX,randY]+randomgauss(means,sigma)
if NoiseImg[randX, randY]< 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]>255:
NoiseImg[randX, randY]=255
return NoiseImg
def PepperandSalt(src,percetage):
NoiseImg=src
NoiseNum=int(percetagesrcshape[0]srcshape[1])
for i in range(NoiseNum):
randX=randomrandint(0,srcshape[0]-1)
randY=randomrandint(0,srcshape[1]-1)
if randomrandint(0,1)<=05:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
covereqg = GaussianNoise(covereq, 2, 4, 08)
CV2imwrite('covereqgpng', covereqg)
covereqps = PepperandSalt(covereq, 005)
CV2imwrite('covereqpspng', covereqps)
下面开始均值滤波和中值滤波了
就以n x n为例,均值滤波就是用这n x n个像素点灰度值的平均值代替中心点,而中值就是中位数代替中心点,边界点周围补0;前两个函数的作用是算出这个点的灰度值,后两个是对整张进行
#均值滤波模板
def mean_filter(x, y, step, img):
sum_s = 0
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 > imgshape[0]
or m-int(step/2) 0 or m+int(step/2)+1 > imgshape[1]:
sum_s += 0
else:
sum_s += img[k][m] / (stepstep)
return sum_s
#中值滤波模板
def median_filter(x, y, step, img):
sum_s=[]
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 > imgshape[0]
or m-int(step/2) 0 or m+int(step/2)+1 > imgshape[1]:
sum_sappend(0)
else:
sum_sappend(img[k][m])
sum_ssort()
return sum_s[(int(stepstep/2)+1)]
def median_filter_go(img, n):
img1 = copydeepcopy(img)
for i in range(imgshape[0]):
for j in range(imgshape[1]):
img1[i][j] = median_filter(i, j, n, img)
return img1
def mean_filter_go(img, n):
img1 = copydeepcopy(img)
for i in range(imgshape[0]):
for j in range(imgshape[1]):
img1[i][j] = mean_filter(i, j, n, img)
return img1
完整main代码如下:
if __name__ == "__main__":
# 读入原始图像
img = CV2imread('joijpg')
# 灰度化处理
gray = CV2cvtColor(img, CV2COLOR_BGR2GRAY)
CV2imwrite('imgpng', gray)
rows = imgshape[0]
cols = imgshape[1]
cover = copydeepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2imwrite('coverpng', cover)
covereq = hist_equal(cover)
CV2imwrite('covereqpng', covereq)
covereqg = GaussianNoise(covereq, 2, 4, 08)
CV2imwrite('covereqgpng', covereqg)
covereqps = PepperandSalt(covereq, 005)
CV2imwrite('covereqpspng', covereqps)
meanimg3 = mean_filter_go(covereqps, 3)
CV2imwrite('medimg3png', meanimg3)
meanimg5 = mean_filter_go(covereqps, 5)
CV2imwrite('meanimg5png', meanimg5)
meanimg7 = mean_filter_go(covereqps, 7)
CV2imwrite('meanimg7png', meanimg7)
medimg3 = median_filter_go(covereqg, 3)
CV2imwrite('medimg3png', medimg3)
medimg5 = median_filter_go(covereqg, 5)
CV2imwrite('medimg5png', medimg5)
medimg7 = median_filter_go(covereqg, 7)
CV2imwrite('medimg7png', medimg7)
medimg4 = median_filter_go(covereqps, 7)
CV2imwrite('medimg4png', medimg4)
这个 gui就没有套了 你自己套下吧 论坛学一下吧 这里给出源程序 直方图增强
clear all
%一,图像的预处理,读入彩色图像将其灰度化
PS=imread('s7jpg'); %读入JPG彩色图像文件
figure(1);subplot(2,2,1);imshow(PS);title('原图像灰度图');
%二,绘制直方图
[m,n]=size(PS); %测量图像尺寸参数
GP=zeros(1,256); %预创建存放灰度出现概率的向量
for k=0:255
GP(k+1)=length(find(PS==k))/(mn); %计算每级灰度出现的概率,将其存入GP中相应位置
end
figure(1);subplot(2,2,2);bar(0:255,GP,'g') %绘制直方图
title('原图像直方图')
xlabel('灰度值')
ylabel('出现概率')
%三,直方图均衡化
S1=zeros(1,256);
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %计算Sk
end
end
S2=round((S1256)+05); %将Sk归到相近级的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
figure(1);subplot(2,2,4);bar(0:255,GPeq,'b') %显示均衡化后的直方图
title('均衡化后的直方图')
xlabel('灰度值')
ylabel('出现概率')
%四,图像均衡化
PA=PS;
for i=0:255
PA(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素
end
figure(1);subplot(2,2,3);imshow(PA) %显示均衡化后的图像
title('均衡化后图像')
imwrite(PA,'PicEqualbmp');
能不能把PIL(PythonImageLibrary)也弄进来,那就简单了。
PIL中可以把图像模式convert,例如转成“L”模式,8位,就变成灰色了。
1、首先点击打开PS软件,如图所示,
2、点击文件-打开加载所需要处理的,如图所示,
3、在右侧右键点击选择复制图层,如图所示,
4、接着在PS上方工具栏中点击打开图像菜单,如图所示,
5、在图像子菜单中,点击模式功能,如图所示,
6、在右侧模式子菜单中,点击选择选择灰度,选择合并图像且扔掉颜色信息,如图所示,
7、选择之后即可将彩色图像转化为灰度图像,如图所示。点击另存为即可!
先进行灰度化,IplImage
pImg
=
cvLoadImage(
"C:\\1bmp",
0
);
这样图像已经灰度化,然后调用cvThreshold(image,
image,
125,
255,
CV_THRESH_BINARY);
就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了
以上就是关于灰度化的方法有哪些全部的内容,包括:灰度化的方法有哪些、数字图像处理Python实现图像灰度变换、直方图均衡、均值滤波、急求matlab GUI转化为灰度图像和图像增强的代码!!!!!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)