当前位置:网站首页>【 amélioration de la correction d'image de Code bidimensionnel】 simulation du traitement d'amélioration de la correction d'image de Code bidimensionnel basée sur MATLAB
【 amélioration de la correction d'image de Code bidimensionnel】 simulation du traitement d'amélioration de la correction d'image de Code bidimensionnel basée sur MATLAB
2022-06-28 02:38:00 【FPGA et MATLAB】
1.Version logicielle
matlab2013b
2.Aperçu du processus d'algorithme
La zone d'image et les limites de la partie de code 2D sont obtenues par traitement morphologique;
L'algorithme de la coque convexe est utilisé pour calculer l'ensemble de points sur la limite;
Ensuite, cherchez les quatre sommets du Code QR à partir de l'ensemble de points,
Puis la transformation de perspective corrige,Le Code QR est divisé en points dans chaque grille.
Normalisation de l'image du Code QR.Correction complète du Code QR.
Ensuite, faites une comparaison expérimentale avec d'autres méthodes de détection de bord plushoughTaux de reconnaissance de l'image corrigée par transformation.
Amélioration de l'éclairage avant l'opération de binarisation,En combinant le filtrage homomorphe et l'égalisation des histogrammes,Puis il a adoptéostuMéthode de binarisation.
En localisant les trois coins du Code QR,Et puis par dilatation,Et la zone connectée.Supprimer les zones connectées qui ne sont pas les trois éléments de la sonde,Ensuite, corrodez le reste de la zone connectée,Effectuer une détection de bord,Les ensembles de points sur les bords résultants sont reliés par la méthode de la coque convexe,
Déterminer approximativement les limites du Code QR,Ensuite, les quatre sommets sont déterminés de la façon la plus courte possible à partir des quatre lignes extérieures.
3.Source partielle
clc;
clear all;
close all;
warning off;
addpath 'func\'
%filename ='1.jpg';
%filename ='2.jpg';
%filename ='3.jpg';
filename ='4.jpg';
X = imread(filename);
% Obtenir des informations sur les images
[R,C,K] = size(X);
if K == 3
f = rgb2gray(X);
else
f = X;
end
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% En utilisant le filtre Wavelet + Un schéma de filtrage amélioré pour le filtrage médian
figure
subplot(141);
imshow(f);
title('Image originale');
f = imadjust(f,[0.1 0.8],[]);
f = func_wavelet_filter(f);
subplot(142);
imshow(f);
title(' Image après filtrage d'ondes et amélioration de la lumière ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Basé surOSTU Extraction binaire de la méthode
G = f;
f = func_ostu(f);
f =~f;
subplot(143);
imshow(f);
title('ostu Image binaire de traitement ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
% Expansion morphologique
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SE = strel('disk',8);
I = imdilate(f,SE);
% Supprimer les petites zones
I = bwareaopen(I,20000);
% Trouver le Centre de gravité de l'image entière
subplot(144);
imshow(I);
title(' Image morphologique agrandie ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tag Connection Domain
[L,num]=bwlabel(I,8);
figure
subplot(141);
imshow(L);
% Supprimer les domaines connectés indépendants , Les mesures d'élimination ont été améliorées ici , Méthodes précédentes beaucoup d'images de test ne peuvent pas être traitées correctement
[R,C,K] = size(I);
L2 = zeros(R,C);
for i=1:num
[r,c]=find(L==i); %Calculer les coordonnées
if isempty(r) == 0 & isempty(c) == 0
a2(i) = min(r); %Calculer les coordonnées
a1(i) = max(r); %Calculer les coordonnées
b2(i) = min(c); %Calculer les coordonnées
b1(i) = max(c); %Calculer les coordonnées
% Déterminer si la zone est correcte en fonction de la zone
Lss = a1(i) - a2(i);
Wss = b1(i) - b2(i);
if (Lss>=0.9*Wss & Lss<=1.1*Wss) | (Wss>=0.9*Lss & Wss<=1.1*Lss)
for j = 1:length(r)
L2(r(j),c(j)) = L(r(j),c(j));
end
end
end
end
SE = strel('disk',8);
T=imerode(L2,SE);
T=imfill(T,'holes');
subplot(142);
imshow(T);
title(' Corrosion morphologique ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Extraire les bords
T2=edge(T,'prewitt');
subplot(143);
imshow(T2);
title('Extraire les bords');
% Ensemble de points à déterminer pour les coques convexes , Cette section a été améliorée , La méthode originale est défectueuse , Les problèmes de bordure ne seront pas détectés
[y,x] = find(T2==1);
img = ones(size(T2));
p = [];
for i=1:length(x)
img(y(i),x(i))=0;
p=[p;x(i),y(i)];
end
subplot(144);
imshow(img);
% Calculer la coque convexe comme suit
[t,index] = max(p(:,2));
%TrouveryLe plus grand point
tmp_p = p(index,:);
% Mettre en place un et y Le plus grand point parallèle
tmp_heng =[tmp_p(1)+100,tmp_p(2)];
for i=1:length(p)
% Demandez à chaque point et y Angle du point le plus grand , Je me suis incliné avec moi - même NAN
Ang(i) = func_angle(tmp_heng,p(i,:),tmp_p);
end
Ang = Ang';
p =[p,Ang];
%Trier par la troisième colonne, La troisième colonne est le degré d'angle inclus
p = sortrows(p,3);
%reéquivalent à la pile
re{1} = p(length(p),1:2);
re{2} = p(1,1:2);
re{3} = p(2,1:2);
top = 3;
for i=3:length(p)-1
while func_multi(p(i,1:2),re{top-1},re{top})>=eps
top=top-1;
if top<=1
break;
end
end
top=top+1;
re{top}=p(i,1:2);
end
% Voici les points qui relient les bosses trouvées
for i=2:top
imgs = drawline(img,re{i-1}(1),re{i-1}(2),re{i}(1),re{i}(2));
end
imgs = drawline(img,re{1}(1),re{1}(2),re{top}(1),re{top}(2));
figure
subplot(231);
imshow(imgs)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculer quatre sommets
jiaodian2 = func_cal_point(imgs);
% Ici, le Vertex initial est corrigé en utilisant des mesures de correspondance de similarité
[jiaodian3,jiaodian4] = func_cal_point_adjust(jiaodian2,G);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Correction
Z=func_adjust(jiaodian4,G);
subplot(232);
imshow(uint8(G))
hold on
for i = 1:4
plot(jiaodian2(i,2),jiaodian2(i,1),'g.');
hold on;
text(jiaodian2(i,2),jiaodian2(i,1),num2str(i));
end
subplot(233);
imshow(uint8(G))
hold on
for i = 1:4
plot(jiaodian4(i,2),jiaodian4(i,1),'r.');
hold on;
plot(jiaodian3(i,2),jiaodian3(i,1),'g.');
hold on;
end
subplot(234);
imshow(uint8(G))
hold on
for i = 1:3
line([jiaodian4(i,2),jiaodian4(i+1,2)],[jiaodian4(i,1),jiaodian4(i+1,1)],'Color',[0 1 0]);
hold on;
end
line([jiaodian4(end,2),jiaodian4(1,2)],[jiaodian4(end,1),jiaodian4(1,1)],'Color',[0 1 0]);
subplot(235);
Z2 = histeq(uint8(Z));
imshow(Z2);
subplot(236);
thresh=graythresh(Z2);
f = im2bw(Z2,thresh);
imshow(f);
%%
% Diviser le résultat final
[R,C] = size(Z2);
Z3 = edge(Z2,'canny');
%Balayage de ligne
tmp1 = 0;
tmp2 = 0;
for i = 2:R
tmp1 = f(i-1,:);
tmp2 = f(i,:);
diff1(i) = abs(mean(tmp1 - tmp2));
end
%Rechercher le minimum
[pks1,locs1]=findpeaks(-1*diff1,'minpeakdistance',3); % Find peaks
%Balayage de colonne
tmp1 = 0;
tmp2 = 0;
for i = 2:C
tmp1 = f(:,i-1);
tmp2 = f(:,i);
diff2(i) = abs(mean(tmp1 - tmp2));
end
%Rechercher le minimum
[pks2,locs2]=findpeaks(-1*diff2,'minpeakdistance',3); % Find peaks
locs1 = [locs1];
locs2 = [locs2];
% Obtenir un Code QR normalisé
QRcode = zeros(length(locs1),length(locs2));
for i = 1:length(locs1)
for j = 1:length(locs2)
QRcode(i,j) = f(locs1(i),locs2(j));
end
end
%Compensation
QRcode = QRcode;
figure;
subplot(3,2,1);
imshow(Z2);
subplot(3,2,2);
imshow(Z3);
subplot(3,2,3);
plot(diff1);
hold on;
plot(locs1,diff1(locs1),'k^','markerfacecolor',[1 0 0]);
title(' Projection horizontale du bord ');
subplot(3,2,4);
plot(diff2);
hold on;
plot(locs2,diff2(locs2),'k^','markerfacecolor',[1 0 0]);
title(' Projection verticale du bord ');
subplot(3,2,5);
imshow(Z2,[]);
title(' Image corrigée en perspective ');
subplot(3,2,6);
imshow(QRcode,[]);
title(' Code QR normalisé ');
4.Résultats de la simulation




A10-38
边栏推荐
- Solve the problem that the page cannot scroll when ionic4 uses the hammerjs gesture press event
- Fundamentals of scala (3): operators and process control
- stm32f1中断介绍
- Jenkins - Pipeline concept and creation method
- NER中BiLSTM-CRF解读Forward_algorithm
- 【历史上的今天】6 月 2 日:苹果推出了 Swift 编程语言;电信收购联通 C 网;OS X Yosemite 发布
- SQL injection bypass (IV)
- Learn pickle
- 【二维码图像矫正增强】基于MATLAB的二维码图像矫正增强处理仿真
- 【历史上的今天】6 月 19 日:iPhone 3GS 上市;帕斯卡诞生;《反恐精英》开始测试
猜你喜欢

How to realize red, green and yellow traffic lights in ros+gazebo?

MySQL collection, here are all the contents you want

Skills in schematic merging

The interviewer asked: can you simulate the new operator of JS

【历史上的今天】6 月 25 日:笔记本之父诞生;Windows 98 发布;通用产品代码首次商用

Starting sequence of Turing machine

【历史上的今天】5 月 31 日:Amiga 之父诞生;BASIC 语言的共同开发者出生;黑莓 BBM 停运

STM32的通用定时器与中断

Low code solution - a low code solution for digital after-sales service covering the whole process of work order, maintenance and Finance

From how to use to how to implement a promise
随机推荐
Jenkins - data sharing and transfer between copy artifact plug-in builds
General timer and interrupt of stm32
Truth table of common anode digital tube
Teach you how to realize pynq-z2 bar code recognition
The system administrator has set the system policy to prohibit this installation. Solution
Jenkins - groovy postbuild plug-in enriches build history information
SQL injection bypass (V)
High reliability application knowledge map of Architecture -- the path of architecture evolution
【历史上的今天】6 月 5 日:洛夫莱斯和巴贝奇相遇;公钥密码学先驱诞生;函数语言设计先驱出生
Redis~geospatial (geospatial), hyperloglog (cardinality Statistics)
The interviewer asked: can you simulate the new operator of JS
数据清洗工具flashtext,效率直接提升了几十倍数
SQL 注入绕过(五)
我今天忘带手机了
Mysql大合集,你要内容的这里全都有
【历史上的今天】6 月 18 日:京东诞生;网店平台 Etsy 成立;Facebook 发布 Libra 白皮书
Dynamic Host Configuration Protocol
【历史上的今天】6 月 12 日:美国进入数字化电视时代;Mozilla 的最初开发者出生;3Com 和美国机器人公司合并
LeetCode - Easy - 197
stm32f1中断介绍