複雜背景,字元和背景亮度差異大的驗證碼識別

2021-06-12 10:39:55 字數 2144 閱讀 2692

對於背景比較複雜,字元顏色明亮的驗證碼,我們可以通過hsl中的亮度來區分字元和背景。適用的驗證碼如下:

可以看到上述的驗證碼,雖然背景很複雜,但是有乙個特點就是背景的亮度普遍比字元的亮度低(不然背景複雜就看不到字元啦。)

我們可以用hsl(色調,飽和度,亮度)來表示每乙個畫素點,然後對亮度進行累積。以第一幅圖為例:

通過對亮度做直方圖,我們可以發現有四個峰值,分別以這四個峰值為閾值,我們就可以取出四個字元了。

得到後面一張以後,就可以很簡單的做分割識別了。

附上matlab程式和效果圖:

程式:

clc;clear;

maxl = 4;

f=imread('1.png');

subplot(3,3,1);

imshow(f);

title('原始影象');

img = f;

img=mat2gray(img); %任意區間對映到[0,1];

[m n dim]=size(img);

%影象的rgb

r=img(:,:,1);

g=img(:,:,2);

b=img(:,:,3);

%影象rgb2hsl

h=zeros(m,n); %色相角

s=zeros(m,n); %飽和度

l=zeros(m,n); %亮度

for i=1:m

for j=1:n

r=r(i,j);

g=g(i,j);

b=b(i,j);

max=max([r,g,b]);

min=min([r,g,b]);

if max==min

h(i,j)=0;

elseif max==r && g>=b

h(i,j)=60*(g-b)/(max-min);

elseif max==r && g0.5

s(i,j)=(max-min)/(2-2*l(i,j));

endend

endsubplot(3,3,2);

imhist(l);

v=[0 1 0 500];

axis(v);

title('峰值圖');

%統計每個元素在矩陣中出現的次數

n=tabulate(l(:));

n = sortrows(n,-2);

maxy = zeros(1,maxl);

for i = 1:maxl

maxy(i) = n(i,1);

end[x,y,z] = size(f);

for i = 1:maxl

p = f;

for j = 1:x

for k = 1:y

tmp = l(j,k);

if tmp ~= maxy(1,i)

p(j,k,1) = 0;

p(j,k,2) = 0;

p(j,k,3) = 0;

endend

endsubplot(3,3,2+i)

imshow(p);

if i == 1

sum = p;

else

sum = sum + p;

endend subplot(3,3,3+maxl)

imshow(sum);

i0 = im2bw(sum,0.1);

i0 = medfilt2(i0,[3,3]);

subplot(3,3,4+maxl)

imshow(i0);

python opencv提取複雜背景下的文字

簡要說明我的思路 1.我的比較小,先放大。2.灰度處理。3.找到乙個區間值,對初步提取的文字進行膨脹及二次膨脹取輪廓。4。獲取到的輪廓面積,因為我這裡是固定的取裡4個文字,所以我對比取輪廓面積最大的4個 4.最後獲取輪廓的矩形座標點,採用透視變換生成字型 最後還有一些優化的地方 提取 import ...

背景的偏移與定位和背景固定

背景預設是貼著元素的左上角顯示 通過background position可以調整背景在元素中的位置 可選值 也可以直接指定兩個偏移量 background position 50px 50px 第乙個值是水平偏移量 如果指定的是乙個正值,則會向右移動指定的畫素 如果指定的是乙個負值,則會向左移動指...

複雜背景的驗證碼破解

首先我們要去除它的背景,對於這樣稍微複雜的背景,用過去的方法很難做到,上圖的例子還不是很明顯,我發現很多背景色和字母色近似,而且字母顏色是不斷變化的,背景也是不斷變化的 那我初始的想法是找到中使用顏色最多的方法,於是我們用hsl表示各點顏色,接著進行統計,得到最大的幾個峰值,這裡便是中幾個最豐富的顏...