2020-02-18 23:01:19 qq_43246110 阅读数 49
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4401 人正在学习 去看看 贾志刚

1. 实验目的

1.掌握图像直方图的概念和计算方法;
2.理解基于变换函数的图像灰度变换基本原理;
3.理解直方图均衡化的原理;
4.掌握图像空域滤波的基本步骤;
5.熟悉Matlab相关的图像处理操作函数,如imhist函数,imadjust函数,histeq函数,medfilt2函数等。熟悉函数的输入、输出值含义,掌握函数调用和使用。

2. 实验流程

2.1 绘制图像直方图

在这里插入图片描述

2.2 灰度变换

在这里插入图片描述

2.3 直方图均衡化

在这里插入图片描述

2.4 中值滤波

在这里插入图片描述

2.5 自定义中值滤波函数

在这里插入图片描述

3. 实验代码

3.1 生成并绘制图像直方图

%% 直方图的绘制函数
% imhist函数的使用,绘制图像的直方图
clear,clc,close ALL;
tic
%计算图像并绘制直方图
I1 = imread('直方图统计实验1.tif');
I2 = imread('直方图统计实验2.tif');
I3 = imread('直方图统计实验3.tif');
I4 = imread('直方图统计实验4.tif');
figure('Name','原图像','NumberTitle','off');
subplot(2,2,1),imshow(I1),title('图一');
subplot(2,2,2),imshow(I2),title('图二');
subplot(2,2,3),imshow(I3),title('图三');
subplot(2,2,4),imshow(I4),title('图四');
%使用bar函数绘制图像直方图
P1 = imhist(I1,64);
P2 = imhist(I2,64);
P3 = imhist(I3,64);
P4 = imhist(I4,64);
figure('Name','图像的直方图绘制','NumberTitle','off');
subplot(2,2,1);horz1 = linspace(0,255,64);
bar(horz1,P1);title('bar函数绘制图一');ylim('auto');
subplot(2,2,2);horz2 = linspace(0,255,64);
bar(horz2,P2);title('bar函数绘制图二');ylim('auto');
subplot(2,2,3);horz3 = linspace(0,255,64);
bar(horz3,P3);title('bar函数绘制图三');ylim('auto');
subplot(2,2,4);horz4 = linspace(0,255,64);
bar(horz4,P4);title('bar函数绘制图四');ylim('auto');
toc

3.2 灰度变换

%% 灰度变换操作函数
% imadjust函数的使用,对灰度级图像进行灰度变换
clear,clc,close ALL;
tic
%第一张图片的灰度变换
P1 = imread('灰度变换实验1.tif');
A1 = imadjust(P1, [0 1], [0 1], 0.2);
A2 = imadjust(P1, [0 1], [0 1], 0.5);
A3 = imadjust(P1, [0 1], [0 1], 1);
A4 = imadjust(P1, [0 1], [0 1], 1.5);
A5 = imadjust(P1, [0 1], [0 1], 2);
figure('Name','第一幅图灰度变换','NumberTitle','off');
subplot(2,3,1);
imshow(P1);title('原图像');
subplot(2,3,2);
imshow(A1);title('gamma值为0.2');
subplot(2,3,3);
imshow(A2);title('gamma值为0.5');
subplot(2,3,4);
imshow(A3);title('gamma值为1');
subplot(2,3,5);
imshow(A4);title('gamma值为1.5');
subplot(2,3,6);
imshow(A5);title('gamma值为2');
%第二张图片的灰度变换
P2 = imread('灰度变换实验2.tif');
B1 = imadjust(P2, [0.25 0.75], [0 1], 1);
B2 = imadjust(P2, [0 1], [0.25 0.75], 1);
B3 = imadjust(P2, [0 1], [1 0], 1);
B4 = imadjust(P2, [0 1], [0 0.5], 1);
B5 = imadjust(P2, [0 1], [0.5 1], 1);
figure('Name','第二幅图原图&灰度变换图','NumberTitle','off');
subplot(2,3,1);
imshow(P2);title('原图像');
subplot(2,3,2);
imshow(B1);title('gamma值为1,[0.25 0.75] → [0 1]');
subplot(2,3,3);
imshow(B2);title('gamma值为1,[0 1] → [0.25 0.75]');
subplot(2,3,4);
imshow(B3);title('gamma值为1,[0 1] → [1 0]');
subplot(2,3,5);
imshow(B4);title('gamma值为1,[0 1] → [0 0.5]');
subplot(2,3,6);
imshow(B5);title('gamma值为1,[0 1] → [0.5 1]');
toc

3.3 直方图均衡化

%% 直方图均衡化函数
% histeq函数的使用,实现直方图的均衡化
clear,clc,close ALL;
tic
%第一张图片
P1 = imread('直方图均衡化1.tif');
figure('Name','第1幅图像','NumberTitle','off');
subplot(2,2,1);
imshow(P1);title('原图像1');
subplot(2,2,3);
imhist(P1);title('原图像1直方图');ylim('auto');
%第一张图片的均衡化
T1 = histeq(P1, 256);
subplot(2,2,2);
imshow(T1);title('均衡化后图像1');
subplot(2,2,4);
imhist(T1);title('均衡化后图像1直方图');ylim('auto');
%第二张图片
P2 = imread('直方图均衡化2.tif');
figure('Name','第2幅图像','NumberTitle','off');
subplot(2,2,1);
imshow(P2);title('原图像2');
subplot(2,2,3);
imhist(P2);title('原图像2直方图');ylim('auto');
%第二张图片的均衡化
T2 = histeq(P2, 256);
subplot(2,2,2);
imshow(T2);title('均衡化后图像2');
subplot(2,2,4);
imhist(T2);title('均衡化后图像2直方图');ylim('auto');
toc

3.4 中值滤波函数

%自定义函数实现中值滤波
function B = medianFilter(A, filter)
[height, width] = size(A);
image_in = uint8(A);
image_out = image_in;
m = filter(1);
n = filter(2);
for i=1:height-m+1
    for j=1:width-n+1
        c = image_in(i:i+(m-1),j:j+(n-1));
        c = c(:);
        ans = median(c);
        xx = round(i+(m-1)/2);
        yy = round(j+(n-1)/2);
        image_out(xx,yy) = ans;
    end
end
B = image_out;

3.5 图像中值滤波

%% 自定义中值滤波器
clear,clc,close ALL;
tic
%第一张图片
P1 = imread('noiseImg.tif');
P2 = imread('img.tif');
k1 = 5; 
F11 = medfilt2(P1,[k1, k1]);
F12 = medianFilter(P1, [k1, k1]);
F21 = medfilt2(P2,[k1, k1]);
F22 = medianFilter(P2, [k1, k1]);
%实验图像测试
figure('Name','中值滤波对比图1','NumberTitle','off');
subplot(2,3,1);imshow(P1);title('原图');
subplot(2,3,2);imshow(F11);title('Matlab自带函数实现');
subplot(2,3,3);imshow(F12);title('自定义函数实现');
subplot(2,3,4);imshow(P2);title('原图');
subplot(2,3,5);imshow(F21);title('Matlab自带函数实现');
subplot(2,3,6);imshow(F22);title('自定义函数实现');
% 实际场景图像演练
P2 = imread('IMG_20181228_004340(1).tif');
k2 = 5;
k3 = 11;
k4 = 15;
F21 = medianFilter(P2,[k2,k2]);
F22 = medianFilter(P2,[k3,k3]);
F23 = medianFilter(P2,[k4,k4]);
figure('Name','实际应用','NumberTitle','off')
subplot(2,2,1);imshow(P2);title('原图');
subplot(2,2,2);imshow(F21);title('k=5');
subplot(2,2,3);imshow(F22);title('k=11');
subplot(2,2,4);imshow(F23);title('k=15');
toc

4. 实验结果与分析

4.1 生成并绘制图像直方图实验分析

1、实验原图:
在这里插入图片描述
2、直方图绘制结果:
在这里插入图片描述
3、结果分析:
针对图3.1中的图一,图像看起来偏白,即亮度偏高。观察图3.2中其对应的直方图,可看出图一的直方图灰度大部分分布在130-250 之间,而在低灰度区域基本无值,因此导致图像整体偏亮;
针对图3.1中的图二,图像看起来很灰暗,有一些模糊的感觉,观察起来不是很舒适。观察图3.2中其对应的直方图,可看出图二的直方图灰度大部分分布在100-140之间,因此导致图像整体没有较大的灰度变化,集中在中间灰度区域,导致图像灰暗。
针对图3.1中的图三,图像看起来比较舒适,黑白分明,整体图像较正常。观察图3.2中其对应的直方图,可看出图三的直方图灰度基本上涵盖了0-255的范围,分布较为均衡,有黑有白,因此使得图像整体让人看起来很舒适自然。
针对图3.1中的图四,图像看起来非常暗,基本看不到内容和细节。观察图3.2中其对应的直方图,可看出图四的直方图灰度基本上只在80以下的范围,导致整个图像很暗,不适合观察。
综合上述分析,可以看出:
①图像直方图直观地反应了图像灰暗程度和灰度分布,并合理地解释了图像呈现效果的原因。
②若一幅图像的像素倾向于占据整个可能的灰度级并且分布均匀,则该图像会有高对比度的外观并展示灰色调的较大变化。最终效果是将一幅灰度细节丰富且动态范围较大的图像。
③直方图均衡化操作使得效果偏暗或偏亮的图像均能实现对比度调整,弥补了图像在视觉上难以区分灰度级的差别,也因此体现出了直方图均衡作为自适应对比度增强工具的强大作用。

4.2 灰度变换实验分析

1、实验结果
图一:
在这里插入图片描述
图二:

在这里插入图片描述
2、结果分析
本实验中,将两幅原图进行分类研究。针对原图像一,保持其输入输出范围不变,调整其伽马值产生新的图像,从而观察伽马值对图像灰度变换的影响和效果;针对原图像二,保持其伽马值为1不变,通过调整其输入输出范围,从而观察其灰度变换的效果并做合理分析。下面进行详细分析:
(a)第一幅图像
①图3.3中的图一即为第一幅图的原图像。
②图3.3中的图二gamma值为0.2,可以看出其整幅图像偏亮,根据伽马变化原理(如图1.1不同下的伽马变换曲线图),可得输入的灰度级r=L/4的部分基本上以及被拉伸为输出灰度级s=3L/4。
③图3.3中的图三gamma值为0.5,看出其整幅图像也偏亮,但介于原图和gamma值为0.2之间。
④图3.3中的图四gamma值为1,由于输入输出范围也是[0 1]没有变化,也正如观测一致,图四和原图图一相比没有变化。
⑤图3.3中的图五其gamma值为1.5,看出其整幅图像偏暗。
⑥图3.3中的图六其gamma值为2,观察到其整幅图像更暗,与伽马变换曲线相符。
(b)第二幅图像
①图3.4中的图一即为第二幅图的原图像。
②图3.4中的图二gamma值为1,将输入[0.25 0.75]对应输出为[0 1],根据图像可以看出图二的接近0或255的部分更加充足了,图像黑白两端占比更大了,看起来较原图更加清晰可视。
③图3.4中的图三gamma值为1不变,将输入[0 1]对应输出为[0.25 0.75],根据图像可以看出图三的处理效果刚好与图像二的处理效果相反,最黑最白的两部分反而变得较灰了,灰度中间的部分占比较大,整幅图像看起来比原图的对比度更加低了。
④图3.4中的图四gamma值为1不变,将输入[0 1]对应输出为[1 0],根据图像可以看出图四的操作效果为图像的反转,将黑变白将白变黑,产生了负片的效果。
⑤图3.4中的图五gamma值为1不变,将输入[0 1]对应输出为[0 0.5],根据图像可以看出图像整体变暗,失去了像素值大于128的部分。
⑥图3.4中的图六gamma值为1不变,将输入[0 1]对应输出为[0.5 1],根据图像可以看出图像整体变亮,失去了像素值小于128的部分。
©综合上述分析,可以看出:
①灰度变换中的伽马变换在通用的对比度操作中很有用,可以实现图像反转、扩展灰度级和压缩灰度级等作用。
②扩展灰度级时,可将较暗且暗处细节显现不出的图像进行灰度级扩充,使得图像可视化部分和细节进行增强,从而观察到原本观察不到的图像内容。
③压缩灰度级时,可以将现有的图像进行“冲淡”,将过分饱和的图像进行适当压缩,从而输出一个较为直观而可视的图像。

4.3 直方图均衡化分析

1、实验结果
图一:
在这里插入图片描述
图二:
在这里插入图片描述
2、结果分析
本实验中,分别对图像1和图像2这两种直方图不均衡的图像进行处理。由图3.5和图3.6观察可知,原图像均为灰度范围单一的图像,其原因即直方图中灰度值集中在一个范围。因此,在对两幅图像对应做了直方图均衡化之后,直方图明显进行了扩展拉伸,使得灰度范围较为均匀地占满了[0 255],其对应的处理后的图像也看起来非常的清晰可观,对比度也有了很好的改善,整体图像处理效果较好。也体现了直方图均衡化的重要意义和应用。

4.4 中值滤波实验分析

1、实验结果
图一:
在这里插入图片描述
2、结果分析
由图可得,(a)和(d)分别为两幅图的原图,(b)和(e)为Matlab自带函数对两幅图的处理,而©和(f)是应用自定义函数对原图进行中值滤波处理的图像。
针对第一幅图像的滤波情况,将(b)和©两幅图放大进行观察,发现采用自定义函数medianFilter处理得到的图像和Matlab自带函数medfilt2处理得到的图像一样,但是观察边界部分,发现在图像的边界处,©比(b)更加的精细。探究原因,也正是因为自定义函数medianFilter没有进行边界处理,而medfilt2函数却对边界进行了一定的处理,解释了上述不同的原因。两种中值滤波器都很好地处理了噪声(椒盐噪声)。
针对第二幅图像的滤波情况,将(b)和©两幅图进行对比观察分析,发现两幅图一模一样。探究原因,因为边界处的灰度值处于中间值位置,并没有较暗或较亮。因此边界处并无影响。
综合上述分析,可知:
中值滤波器使用像素邻域内灰度的中值代替该像素的值,其应用非常普遍,对于一定类型的随机噪声,提供了一种优秀的去噪能力,而且比相同尺寸的线性平滑滤波器的模糊程度明显要低。根据中值滤波器的处理特性特点,其处理脉冲噪声(椒盐噪声)非常有效。
(3)课外场景检验:
为验证中值滤波器的实际应用效果,本报告中提供了一张课外图像进行滤波检验,通过调用自定义中值滤波函数进行中值处理,再对滤波器的掩膜大小进行调整、测试,最终给出不同情况下的结果图,从而进一步分析实验结果,具体测试图如下:
在这里插入图片描述
由图3.8可知,原图是含有很多“盐”噪声的,原因来自于电脑屏幕上的灰尘。因此中值滤波器处理在原理上满足图像处理需求。由于噪声大小不确定,不能一次性选取好最佳掩膜大小,因此在本报告中进行了不同大小掩膜的测试,分别取k=5,k=11,k=15进行滤波处理。经过对比分析,得到如下结果:取k=5时,很多“盐”噪声并非处理完好,说明掩膜大小还是不够,没有达到很好的滤波效果;取k=11时,“盐”噪声处理的还可以,基本噪声处理掉了,但还是没有处理的很完善;取k=15时,“盐”噪声全部处理完成,处理效果较好,几乎看不到图像中电脑上的灰尘,显示了中值滤波的实际应用。同时,本报告的拓展也体现了数字图像处理应用的试错性特点以及探索性精神。

2020-02-18 23:35:35 qq_43246110 阅读数 18
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4401 人正在学习 去看看 贾志刚

1. 实验目的

1.理解并掌握图像傅立叶变换的基本原理,注意傅里叶变换的数学基础;
2.掌握图像频域滤波的基本步骤,复习频率域滤波的各个步骤,以及步骤进行的原因和解决的问题,在原理上支撑试验;
3.熟悉 matlab 相关的图像处理操作函数,比如fft2,ifft2,fftshift,ifftshift,abs等函数。熟悉函数的输入、输出值含义,掌握函数调用和使用;

2. 实验流程

2.1 图像傅里叶变换

在这里插入图片描述

2.2 巴特沃斯低通/高通滤波

在这里插入图片描述

2.3 滤波函数

在这里插入图片描述

3. 实验代码

3.1图像傅里叶变换/反变换

%% 二维傅里叶变换实验
clear,clc,close ALL;
tic
%实现并显示图像的傅里叶变换
P1 = imread('fft/1.tif');
P2 = imread('fft/2.tif');
F1 = fft2(P1);
F2 = fft2(P2);
S1 = log(1+abs(F1));
S2 = log(1+abs(F2));
SS1 = fftshift(S1);
SS2 = fftshift(S2);
iS1 = ifftshift(SS1);
iS2 = ifftshift(SS2);
iF1 = ifft2(F1);
iF2 = ifft2(F2);
figure('Name','滤波原图','NumberTitle','off');
subplot(251),imshow(P1),title('图像1原图');
subplot(252),imshow(S1,[]),title('图像1灰度压缩后的频谱图');
subplot(253),imshow(SS1,[]),title('图像1频谱图经fftshift中心化处理');
subplot(254),imshow(iS1,[]),title('图像1频谱图经ifftshift去中心化处理');
subplot(255),imshow(iF1,[]),title('傅里叶反变换图');
subplot(256),imshow(P2),title('图像2原图');
subplot(257),imshow(S2,[]),title('图像2灰度压缩后的频谱图');
subplot(258),imshow(SS2,[]),title('图像2频谱图经fftshift中心化处理');
subplot(2,5,9),imshow(iS2,[]),title('图像2频谱图经ifftshift去中心化处理');
subplot(2,5,10),imshow(iF2,[]),title('傅里叶反变换图');
toc

3.2 巴特沃斯低通滤波

%% 低通滤波器的设计与实现
clear,clc,close ALL;
tic
I1 = imread('lowpass/1.tif');
I11 = imread('lowpass/2.tif');
I111 = imread('lowpass/3.tif');
[M1,N1] = size(I1);%获取图像的大小
[M2,N2] = size(I11);
[M3,N3] = size(I111);
F1 = fft2(I1,2*M1,2*N1);%对图像做傅里叶变换并同时实现填充
F2 = fft2(I11,2*M2,2*N2);
F3 = fft2(I111,2*M3,2*N3);
Fshift1 = fftshift(F1);%中心化
Fshift2 = fftshift(F2);
Fshift3 = fftshift(F3);
H1 = low_f(2*M1,2*N1,2,50);%调用自定义低通滤波函数
H2 = low_f(2*M2,2*N2,2,50);
H3 = low_f(2*M3,2*N3,2,50);
G1 = H1.*Fshift1;%频域相乘,滤波处理
G2 = H2.*Fshift2;
G3 = H3.*Fshift3;
Fi1 = ifftshift(G1);%去中心化
Fi2 = ifftshift(G2);
Fi3 = ifftshift(G3);
Freal1 = real(ifft2(Fi1));%傅里叶反变换,取实部
Freal2 = real(ifft2(Fi2));
Freal3 = real(ifft2(Fi3));
Fint1 = uint8(Freal1);
Fint2 = uint8(Freal2);
Fint3 = uint8(Freal3);
OUT1 = Fint1(1:size(I1,1),1:size(I1,2));%图像还原为原来的大小
OUT2 = Fint2(1:size(I11,1),1:size(I11,2));
OUT3 = Fint3(1:size(I111,1),1:size(I111,2));
figure('Name','频率域滤波','NumberTitle','off');
subplot(3,4,1);imshow(I1),title('原图像1');
subplot(3,4,2);imshow(H1);
subplot(3,4,3);imshow(OUT1);title('低通滤波后图像1');
subplot(3,4,4);mesh(H1);title('滤波器1三维图');
subplot(3,4,5);imshow(I11),title('原图像2');
subplot(3,4,6);imshow(H2);
subplot(3,4,7);imshow(OUT2);title('低通滤波后图像2');
subplot(3,4,8);mesh(H2);title('滤波器2三维图');
subplot(3,4,9);imshow(I111),title('原图像3');
subplot(3,4,10);imshow(H3);
subplot(3,4,11);imshow(OUT3);title('低通滤波后图像3');
subplot(3,4,12);mesh(H3);title('滤波器3三维图');
toc
%自定义函数
function H = low_f(M,N,n,D0)
u0 = M/2;
v0 = N/2;%中心点
for u = 1:M
    for v = 1:N
        D(u,v)= sqrt((v-v0)^2+(u-u0)^2);%各个点到中心点的距离
        H(u,v)=1/(1+(D(u,v)/D0)^(2*n));%传递函数
    end
end

3.3 巴特沃斯高通滤波

%% 高通滤波器的设计与实现
clear,clc,close ALL;
tic
I1 = imread('highpass/1.tif');
I11 = imread('highpass/2.tif');
[M1,N1] = size(I1);
[M11,N11] = size(I11);
F1 = fft2(I1,2*M1,2*N1);
F2 = fft2(I11,2*M11,2*N11);
Fshift1 = fftshift(F1);
Fshift2 = fftshift(F2);
H1 = high_f(2*M1,2*N1,2,50);
H2 = high_f(2*M11,2*N11,2,50);
G1 = H1.*Fshift1;
G2 = H2.*Fshift2;
Fi1 = ifftshift(G1);
Fi2 = ifftshift(G2);
Freal1 = real(ifft2(Fi1));
Freal2 = real(ifft2(Fi2));
Fint1 = uint8(Freal1);
Fint2 = uint8(Freal2);
OUT1 = Fint1(1:size(I1,1),1:size(I1,2));
OUT2 = Fint2(1:size(I11,1),1:size(I11,2));
figure,
subplot(2,4,1);imshow(I1),title('原图');
subplot(2,4,2);imshow(H1);
subplot(2,4,3);imshow(OUT1);title('高通滤波后');
subplot(2,4,4);mesh(H1);title('滤波器1三维图');
subplot(2,4,5);imshow(I11),title('原图');
subplot(2,4,6);imshow(H2);
subplot(2,4,7);imshow(OUT2);title('高通滤波后');
subplot(2,4,8);mesh(H2);title('滤波器2三维图');
toc
%高通滤波函数
function H = high_f(M,N,n,D0)
u0 = M/2;
v0 = N/2;
for u = 1:M
    for v = 1:N
        D(u,v)= sqrt((v-v0)^2+(u-u0)^2);
%         H(u,v)= 1-1/(1+(D(u,v)/D0)^(2*n));
        H(u,v)= 1/(1+(D0/D(u,v))^(2*n));
    end
end

4. 实验结果与分析

4.1 图像傅里叶变换及显示

1、实验原图与结果:

在这里插入图片描述

3、结果分析:

由上图,共图3.1(a)——图3.1(j)十幅图。其中(a)和(f)为两幅图像的原图。(b)和(g)分别为原图经灰度压缩后进行DFT的频谱图,©和(h)是对频谱进行fftshift中心化后的频谱图,(d)和(i)是经过ifftshift去中心化后的频谱图,最后的(e)和(j)是经过ifft2反变换的图像。
由图像,也可看出空域的平移对频域图像带来的拉伸效果。上述的傅里叶变换以及中心化处理和去中心化处理,简单地反应了频域处理的流程,为后续频域滤波奠定基础。

4.2 巴特沃斯低通滤波

1、实验结果

在这里插入图片描述

2、结果分析
本实验中,共对三幅图像进行低通滤波处理,图3.2(a),(e),(i)分别为三幅原图像。
图3.2(b)为对原图像1的低通滤波图,其定义阶数为5,参数为20;图3.2(f)为对原图像2的低通滤波图,其定义阶数为5,参数为50;图3.2(j)为对原图像3的低通滤波图,其定义阶数为5,参数为100。根据对参数数值大小的调整,可看出对整个巴特沃斯低通滤波函数的影响。根据试验分析可知:当参数取值越大时,滤波的“阻断”范围变大,即通过滤波的部分变大,致使低通滤波的效果较差,理论分析可知,当达到一定数值时,低通滤波基本不起作用。
观察图3.2©,(g),(k)三幅实验结果图,可观察到低通滤波效果。证明频域的低通滤波等效于空域的平滑滤波,起到模糊图像的作用。由图3.2©,可知低通滤波效果较好,使得图像整体较为模糊;由图3.2(g),可知随参数的增加,模糊的效果稍微降低了一些;由图3.2(k)可知较大时滤波效果较差。
观察图3.2(d),(h),(l)三幅实验结果图,反应滤波器的三维视图,体现了巴特沃斯低通滤波器的特性:①巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。②在振幅的对数对角频率的波特图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向负无穷大。③滤波器阶数越高,在阻频带振幅衰减速度越快。

4.3 巴特沃斯高通滤波

1、实验结果

在这里插入图片描述
2、结果分析
本实验中,共对两幅图像进行高通滤波处理,图3.3(a),(e)分别为两幅原图像。
图3.3(b)为对原图像1的低通滤波图,其定义阶数为2,参数为20;图3.3(f)为对原图像2的低通滤波图,其定义阶数为5,参数为50。根据对参数数值大小的调整,可看出对整个巴特沃斯高通滤波函数的影响。根据试验分析可知:当参数取值越大时,滤波的“阻断”范围变大,即通过滤波的部分变大,致使高通滤波的效果较差,当滤波范围增大时,整个图像基本均被“滤掉”,导致图像非常的“黑”。理论分析可知,当达到一定数值时,高通滤波基本不起作用。
观察图3.3©,(g)两幅实验结果图,可观察到高通滤波效果。证明频域的高通滤波等效于空域的锐化滤波,起到提取图像细节的作用。由图3.3©,可知高通滤波效果较好,使得图像的整体细节较为全面地展示出来。
观察图3.3(d),(h)两幅实验结果图,反应滤波器的三维视图,体现了巴特沃斯高通滤波器的特性。

4.4 扩展的必要性(缠绕现象)

1、扩展与否的对比
图一:

2、结果分析

由图可得,图3.4(a)为实验原图,(b)和©分别为不进行扩展处理和进行PQ扩展处理的结果图。由图可知,不进行扩展会导致缠绕现象发生,引起图像的边界处处理效果差,并没有合理实现滤波效果。因此,上述实验证明了扩展操作的必要性,证实了理论的正确性。

2020-02-25 15:04:07 qq_36556893 阅读数 740
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4401 人正在学习 去看看 贾志刚

目录

一、实验内容 

二、实验步骤

三、代码

四、结果


一、实验内容 

对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明。

二、实验步骤

1.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

三、代码

import cv2
import numpy as np

# 计算光影背景
def calculateLightPattern(img4):
    h, w = img4.shape[0], img4.shape[1]
    img5 = cv2.blur(img4, (int(w/3), int(w/3)))
    return img5

# 移除背景
def removeLight(img4, img5, method):
    if method == 1:
        img4_32 = np.float32(img4)
        img5_32 = np.float32(img5)
        ratio = img4_32 / img5_32
        ratio[ratio > 1] = 1
        aux = 1 - ratio

        # 按比例转换为8bit格式
        aux = aux * 255
        aux = np.uint8(aux)
    else:
        aux = img5 - img4
    return aux

def ConnectedComponents(aux):
    num_objects, labels = cv2.connectedComponents(aux)

    if num_objects < 2:
        print("connectedComponents未检测到染色体")
        return
    else:
        print("connectedComponents检测到染色体数量为:", num_objects - 1)

    output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)

    for i in range(1, num_objects):
        mask = labels == i
        output[:, :, 0][mask] = np.random.randint(0, 255)
        output[:, :, 1][mask] = np.random.randint(0, 255)
        output[:, :, 2][mask] = np.random.randint(0, 255)
    return output


def ConnectedComponentsStats(aux):
    num_objects, labels, status, centroids = cv2.connectedComponentsWithStats(aux)

    if num_objects < 2:
        print("connectedComponentsWithStats未检测到染色体")
        return
    else:
        print("connectedComponentsWithStats检测到染色体数量为:", num_objects - 1)

    output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)

    for i in range(1, num_objects):
        mask = labels == i
        output[:, :, 0][mask] = np.random.randint(0, 255)
        output[:, :, 1][mask] = np.random.randint(0, 255)
        output[:, :, 2][mask] = np.random.randint(0, 255)
    return output

def FindContours(aux):
    contours, hierarchy = cv2.findContours(aux, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) == 0:
        print("findContours未检测到染色体")
        return
    else:
        print("findContours检测到染色体数量为:", len(contours))

    output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
    for i in range(len(contours)):
        cv2.drawContours(
            output,
            contours,
            i,
            (np.random.randint(0, 255),
             np.random.randint(0, 255),
             np.random.randint(0, 255)), 2)
    return output


# 读取图片
img = cv2.imread('img.png', 0)
pre_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 二值化函数

# 第一步:中值滤波
# 中值滤波
img1 = cv2.medianBlur(img, 3)

# 显示并保存图片
cv2.imshow('gray', img)

cv2.imshow('medianBlur', img1)
cv2.imwrite('medianBlur.jpg', img1)
# 第二步:图像二值化
# 图像二值化
ret, img2 = cv2.threshold(img1, 140, 255, 0, img1)  # 二值化函数

# 显示并保存图片
cv2.imshow('threshold', img2)
cv2.imwrite('threshold.jpg', img2)

# 第三步:膨胀图像
dilate_kernel = np.ones((3, 3), np.uint8)
img3 = cv2.dilate(img2, dilate_kernel)

# 显示并保存图片
cv2.imshow('dilate', img3)
cv2.imwrite('dilate.jpg', img3)

# 第四步:腐蚀图像
erode_kernel = np.ones((7, 7), np.uint8)
img4 = cv2.erode(img3, erode_kernel)

# 显示并保存图片
cv2.imshow('erode', img4)
cv2.imwrite('erode.jpg', img4)

# 第五步:计算光影背景
img5 = calculateLightPattern(img4)
# 显示并保存图片
cv2.imshow('LightPattern', img5)
cv2.imwrite('LightPattern.jpg', img5)

# 第六步:移除背景
aux = removeLight(img4, img5, 1)
# 显示并保存图片
cv2.imshow('removeLight', aux)
cv2.imwrite('removeLight.jpg', aux)

# 第七步:检测轮廓
output1 = ConnectedComponents(aux)
output2 = ConnectedComponentsStats(aux)
output3 = FindContours(aux)
# 显示并保存图片
cv2.imshow('connectedComponents', output1)
cv2.imwrite('connectedComponents.jpg', output1)
cv2.imshow('connectedComponentsWithStats', output2)
cv2.imwrite('connectedComponentsWithStats.jpg', output2)
cv2.imshow('findContours', output3)
cv2.imwrite('findContours.jpg', output3)
cv2.waitKey(0)

四、结果

1.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

(1)connectedComponents.jpg

(2)connectedComponentsWithStats.jpg

(3)findContours.jpg

染色体个数46

 

2018-07-28 20:48:03 practiceandstudy 阅读数 2015
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4401 人正在学习 去看看 贾志刚

                          电气设备红外图像分析与处理

引言

本文的框架流程和创新点

 

图像预处理

RGB图像模型和图像灰度化

图像去噪

                    图2-7 中值滤波的流程

电气设备红外图像提取(图像分割)

      图3-6 基于聚类的图像提取算法流程

电气设备红外图像识别(不仅识别还识别红外热像中互感器的具体区域,帮助运行人员检测互感器的位置坐标,)

互感器的识别

三相电力设备的识别

具体流程如下所示:

①采用数学形态学处理中的幵启运算对图像进行处理,消除相间的纤细连接部位,突出三相设备的主体特征。

②采用连通区域标记的方法对各区域进行分析,并按照面积大小确定三相设备的整体区域。

③根据围成各区域最小凸多边形的顶点坐标,形成了一整套区域判定方法,包括形成约束方程判定位于多边形内的点集,最终将三相电力设备分相识别出来。该步骤是三相电力识别的核心,即将每一相的设备独立区分并能单独识别出来。

④根据区域重心横坐标的大小关系最终确定三相设备的相序,每一相形成一幅独立的图像。

电气设备温度识别的步骤

电气设备红外图像温度识别

电气设备红外图像故障识别

2019-06-17 22:57:13 serieslover4 阅读数 88
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4401 人正在学习 去看看 贾志刚

图像各向异性平滑滤波

介绍

图像处理中先验知识较少的情况下,需要在保留图像边缘信息下同时对图像进行平滑,可以采用将越明显的边缘减少平滑率的方式进行滤波,就是今天要讲的PM各向异性扩散滤波。

https://max.book118.com/html/2018/0913/6034150213001215.shtm
https://wenku.baidu.com/view/9c2897cbf78a6529657d5391.html

原理解析

公式
通过迭代计算最佳扩散平滑尺度,
迭代方程
一般迭代1到100次,可以通过获取的最佳效果来决定。

实现

function [filtmap2d] = anisotropicfiltering(map2d, iterations, lambda, contrastK, smoothsigma, Dosharpenfirst, sharpensigma)
%ANISOTROPICFILTER 此处显示有关此函数的摘要
%   此处显示详细说明

	if iterations <= 0
	    iterations = 100;
	end
	if smoothsigma <= 0
	    smoothsigma = 2;
	end
	smoothfilt = fspecial('gaussian',ceil(6*smoothsigma),smoothsigma);
	contrastK_square = contrastK^2;
	if Dosharpenfirst == true
	    result_map2d = tools_sharpen(grapmap3d, sharpensigma);
	    result_map2d(result_map2d < 0) = 0;
	    result_map2d = result_map2d / 256;
	else
	    result_map2d = map2d / 256;
	end
	for iter=1:iterations
	    Delta_N = result_map2d(1:end-2,2:end-1) - result_map2d(2:end-1,2:end-1);
	    Delta_S = result_map2d(3:end,2:end-1) - result_map2d(2:end-1,2:end-1);
	    Delta_E = result_map2d(2:end-1,3:end) - result_map2d(2:end-1,2:end-1);
	    Delta_W = result_map2d(2:end-1,1:end-2) - result_map2d(2:end-1,2:end-1);
	
	% % %   PM filter
	    g_N = exp(-(Delta_N.^2)/contrastK_square);
	    g_S = exp(-(Delta_S.^2)/contrastK_square);
	    g_E = exp(-(Delta_E.^2)/contrastK_square);
	    g_W = exp(-(Delta_W.^2)/contrastK_square);
	
	% % % %   catte et al filter (gaussian smoothing)
	%     temp_map2d = imfilter(result_map2d, smoothfilt);
	%     temp_Delta_N = temp_map2d(1:end-2,2:end-1) - temp_map2d(2:end-1,2:end-1);
	%     temp_Delta_S = temp_map2d(3:end,2:end-1) - temp_map2d(2:end-1,2:end-1);
	%     temp_Delta_E = temp_map2d(2:end-1,3:end) - temp_map2d(2:end-1,2:end-1);
	%     temp_Delta_W = temp_map2d(2:end-1,1:end-2) - temp_map2d(2:end-1,2:end-1);
	%     g_N = 1 ./ (1+(temp_Delta_N.^2)/contrastK_square);
	%     g_S = 1 ./ (1+(temp_Delta_S.^2)/contrastK_square);
	%     g_E = 1 ./ (1+(temp_Delta_E.^2)/contrastK_square);
	%     g_W = 1 ./ (1+(temp_Delta_W.^2)/contrastK_square);
	    
	    result_map2d(2:end-1,2:end-1) = result_map2d(2:end-1,2:end-1) + lambda .* (g_N.*Delta_N + g_S.*Delta_S + g_E.*Delta_E + g_W.*Delta_W);
	    
	    if mod(iter,5) == 0
	        figure;imshow(result_map2d(2:end-1,2:end-1),[]);
	    end
	end
	
	filtmap2d = result_map2d;
	filtmap2d(1,:) = result_map2d(2,:);
	filtmap2d(end,:) = result_map2d(end-1,:);
	filtmap2d(:,1) = result_map2d(:,2);
	filtmap2d(:,end) = result_map2d(:,end-1);
	filtmap2d = (filtmap2d - min(filtmap2d(:))) / (max(filtmap2d(:)) - min(filtmap2d(:))) * 256;
end
没有更多推荐了,返回首页