對於背景比較複雜,字元顏色明亮的驗證碼,我們可以通過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表示各點顏色,接著進行統計,得到最大的幾個峰值,這裡便是中幾個最豐富的顏...