├── README.md ├── bgs_10 ├── 00001.jpg ├── 00002.jpg ├── 00003.jpg ├── 00004.jpg └── 00005.jpg ├── common_cn.py ├── fonts_cn └── simhei.ttf ├── gen_cn_txt.py ├── sythdata.sh └── word.txt /README.md: -------------------------------------------------------------------------------- 1 | ### synthdata-zh is a project that generates a Chinese language training set 2 | -------------------------------------------------------------------------------- /bgs_10/00001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/bgs_10/00001.jpg -------------------------------------------------------------------------------- /bgs_10/00002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/bgs_10/00002.jpg -------------------------------------------------------------------------------- /bgs_10/00003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/bgs_10/00003.jpg -------------------------------------------------------------------------------- /bgs_10/00004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/bgs_10/00004.jpg -------------------------------------------------------------------------------- /bgs_10/00005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/bgs_10/00005.jpg -------------------------------------------------------------------------------- /common_cn.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright (c) 2016 Matthew Earl 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the 'Software'), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included 13 | # in all copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 | # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 18 | # NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 19 | # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 | # USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | ''' 24 | Definitions that don't fit elsewhere. 25 | 26 | ''' 27 | 28 | __all__ = ( 29 | 'DIGITS', 30 | 'LETTERS', 31 | 'CHINESE', 32 | 'CHARS', 33 | 'sigmoid', 34 | 'softmax', 35 | ) 36 | 37 | import numpy 38 | 39 | 40 | DIGITS = '0123456789' 41 | LETTERS = 'abdefghijmnqrtuyABCDEFGHJKLMNPQRSTUVWXYZ' 42 | CHINESE = u'京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川黔滇藏陕甘青宁新港澳台' 43 | CHARS = DIGITS + LETTERS + CHINESE 44 | 45 | def softmax(a): 46 | exps = numpy.exp(a.astype(numpy.float64)) 47 | return exps / numpy.sum(exps, axis=-1)[:, numpy.newaxis] 48 | 49 | def sigmoid(a): 50 | return 1. / (1. + numpy.exp(-a)) 51 | 52 | -------------------------------------------------------------------------------- /fonts_cn/simhei.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoungMiao/synthdata-zh/51597436146514faef5d0199e8af90cc10928be9/fonts_cn/simhei.ttf -------------------------------------------------------------------------------- /gen_cn_txt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright (c) 2016 Matthew Earl 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the 'Software'), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included 13 | # in all copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 | # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 18 | # NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 19 | # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 | # USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | 24 | 25 | ''' 26 | Generate training and test images. 27 | 28 | ''' 29 | 30 | 31 | __all__ = ( 32 | 'generate_ims', 33 | ) 34 | 35 | 36 | import itertools 37 | import math 38 | import os 39 | import random 40 | import sys 41 | import colorsys 42 | import cv2 43 | import numpy 44 | import math 45 | import time 46 | import linecache 47 | import argparse 48 | from PIL import Image 49 | from PIL import ImageDraw 50 | from PIL import ImageFont 51 | import common_cn 52 | 53 | 54 | timestr = time.strftime('%Y_%m_%d',time.localtime(time.time())) 55 | parser = argparse.ArgumentParser() 56 | parser.add_argument('--bgs', default=None, help='path to backgrounds') 57 | parser.add_argument('--fonts', default=None, help='path to fonts') 58 | parser.add_argument('--fh', type=int, default=48, help='pixel size to which the chars are resized') 59 | parser.add_argument('--output', default=None, help='path to create datasets') 60 | parser.add_argument('--label', required=True, help='path to words label') 61 | parser.add_argument('--trainlabel', default=None, help='path to create train label') 62 | parser.add_argument('--vallabel', default=None, help='path to create val label') 63 | parser.add_argument('--sumnumber', type=int, default=4, help='number of word') 64 | parser.add_argument('--trainnum', type=int, default=3, help='number of trainword') 65 | parser.add_argument('--str', type=str,default=timestr, help='de for datasets') 66 | opt = parser.parse_args() 67 | 68 | if opt.bgs is None: 69 | opt.bgs = './bgs_1' 70 | try: 71 | os.path.exists(opt.bgs) 72 | except ZeroDivisionError,e: 73 | print "except:",e 74 | if opt.fonts is None: 75 | opt.fonts = './fonts_cn' 76 | try: 77 | os.path.exists(opt.fonts) 78 | except ZeroDivisionError,e: 79 | print "except:",e 80 | if opt.output is None: 81 | opt.output = './datasets' 82 | if not os.path.exists(opt.output): 83 | os.mkdir(opt.output) 84 | if opt.trainlabel is None: 85 | opt.trainlabel = './train.txt' 86 | if opt.vallabel is None: 87 | opt.vallabel = './val.txt' 88 | assert opt.trainnum <= opt.sumnumber 89 | print(opt) 90 | 91 | BGS_DIR = opt.bgs 92 | FONT_DIR = opt.fonts 93 | FONT_HEIGHT = opt.fh 94 | R_OUTPUT_DIR = opt.output 95 | WORD_TXT = opt.label 96 | train_lable = opt.trainlabel 97 | test_lable = opt.vallabel 98 | 99 | def make_char_ims(font_path, output_height,font_color): 100 | 101 | b = random.randint(30,50) 102 | font_size = output_height * 4 103 | font = ImageFont.truetype(font_path, font_size) 104 | height = max(font.getsize(c)[1] for c in CHARS)+b 105 | for c in CHARS: 106 | width = font.getsize(c)[0] 107 | im = Image.new('RGB', (width, height), (0, 0, 0)) 108 | 109 | draw = ImageDraw.Draw(im) 110 | draw.text((0, 0), c, font_color,font=font) 111 | scale = float(output_height) / (height-b) 112 | im = im.resize((int(width * scale), output_height), Image.ANTIALIAS) 113 | yield c, numpy.array(im).astype(numpy.float32) / 255. 114 | 115 | def euler_to_mat(yaw, pitch, roll): 116 | 117 | # Rotate clockwise about the Y-axis 118 | c, s = math.cos(yaw), math.sin(yaw) 119 | M = numpy.matrix([[ c, 0., s], 120 | [ 0., 1., 0.], 121 | [ -s, 0., c]]) 122 | 123 | # Rotate clockwise about the X-axis 124 | c, s = math.cos(pitch), math.sin(pitch) 125 | M = numpy.matrix([[ 1., 0., 0.], 126 | [ 0., c, -s], 127 | [ 0., s, c]]) * M 128 | 129 | # Rotate clockwise about the Z-axis 130 | c, s = math.cos(roll), math.sin(roll) 131 | M = numpy.matrix([[ c, -s, 0.], 132 | [ s, c, 0.], 133 | [ 0., 0., 1.]]) * M 134 | 135 | return M 136 | 137 | def pick_colors(): 138 | 139 | text_color = 1. 140 | 141 | return text_color 142 | 143 | def make_affine_transform(from_shape, to_shape, 144 | min_scale, max_scale, 145 | scale_variation=1.0, 146 | rotation_variation=1.0, 147 | translation_variation=1.0): 148 | 149 | out_of_bounds_scale = True 150 | out_of_bounds_trans = True 151 | from_size = numpy.array([[from_shape[1], from_shape[0]]]).T 152 | to_size = numpy.array([[to_shape[1], to_shape[0]]]).T 153 | 154 | while out_of_bounds_scale: 155 | scale = random.uniform((min_scale + max_scale) * 0.5 - 156 | (max_scale - min_scale) * 0.5 * scale_variation, 157 | (min_scale + max_scale) * 0.5 + 158 | (max_scale - min_scale) * 0.5 * scale_variation) 159 | if scale > max_scale or scale < min_scale: 160 | continue 161 | out_of_bounds_scale = False 162 | 163 | roll = random.uniform(-0.3, 0.3) * rotation_variation 164 | pitch = random.uniform(-0.2, 0.2) * rotation_variation 165 | yaw = random.uniform(-1.2, 1.2) * rotation_variation 166 | M = euler_to_mat(yaw, pitch, roll)[:2, :2] 167 | h, w = from_shape[0], from_shape[1] 168 | corners = numpy.matrix([[-w, +w, -w, +w], 169 | [-h, -h, +h, +h]]) * 0.5 170 | skewed_size = numpy.array(numpy.max(numpy.dot(M, corners), axis=1) - 171 | numpy.min(numpy.dot(M, corners), axis=1)) 172 | # Set the scale as large as possible such that the skewed and scaled shape 173 | # is less than or equal to the desired ratio in either dimension. 174 | scale *= numpy.min(to_size / skewed_size) 175 | # Set the translation such that the skewed and scaled image falls within 176 | # the output shape's bounds. 177 | while out_of_bounds_trans: 178 | trans = (numpy.random.random((2,1)) - 0.5) * translation_variation 179 | trans = ((2.0 * trans) ** 5.0) / 2.0 180 | if numpy.any(trans < -0.5) or numpy.any(trans > 0.5): 181 | continue 182 | out_of_bounds_trans = False 183 | trans = (to_size - skewed_size * scale) * trans 184 | 185 | center_to = to_size / 2. 186 | center_from = from_size / 2. 187 | M = euler_to_mat(yaw, pitch, roll)[:2, :2] 188 | M *= scale 189 | T = trans + center_to - numpy.dot(M, center_from) 190 | M = numpy.hstack([M, T]) 191 | return M 192 | 193 | 194 | def generate_code(): 195 | 196 | code = CHARS 197 | 198 | return code 199 | 200 | def generate_text(font_height, char_ims): 201 | 202 | h_padding = random.uniform(0.2, 0.4) * font_height 203 | v_padding = random.uniform(0.1, 0.3) * font_height 204 | spacing = font_height * random.uniform(-0.05, 0.05) 205 | radius = 1 + int(font_height * 0.1 * random.random()) 206 | 207 | code = generate_code() 208 | text_width = sum(char_ims[c].shape[1] for c in code) 209 | text_width += (len(code) - 1) * spacing 210 | 211 | out_shape = (int(font_height + v_padding * 2), 212 | int(text_width + h_padding * 2), 3) 213 | 214 | text_color = pick_colors() 215 | text_mask = numpy.zeros(out_shape) 216 | 217 | x = h_padding 218 | y = v_padding 219 | for c in code: 220 | char_im = char_ims[c] 221 | ix, iy = int(x), int(y) 222 | text_mask[iy:iy + char_im.shape[0], ix:ix + char_im.shape[1], :] = char_im 223 | x += char_im.shape[1] + spacing 224 | 225 | text = numpy.ones(out_shape) * text_color * text_mask 226 | return text,text_mask,code 227 | 228 | 229 | def generate_bg(images_dir): 230 | 231 | while True: 232 | filenames = os.listdir(images_dir) 233 | lines = len(filenames) 234 | randline = random.randint(0,lines) 235 | loadlist = [] 236 | for i in xrange(0,opt.sumnumber): 237 | loadlist.append(filenames[random.randint(0,(lines-1))]) 238 | for fn in loadlist: 239 | fullfilename = os.path.join(images_dir,fn) 240 | bg = cv2.imread(fullfilename, cv2.CV_LOAD_IMAGE_COLOR) 241 | bg = bg / 255. 242 | yield bg 243 | 244 | def get_dominant_color(image): 245 | 246 | cv2.imwrite('1.jpg',image) 247 | image = Image.open('1.jpg').convert('RGBA') 248 | max_score = None 249 | dominant_color = None 250 | for count, (r, g, b, a) in image.getcolors(image.size[0] * image.size[1]): 251 | if a == 0: 252 | continue 253 | saturation = colorsys.rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)[1] 254 | y = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235) 255 | y = (y - 16.0) / (235 - 16) 256 | 257 | if y > 0.9: 258 | dominant_color = (r, g, b) 259 | continue 260 | 261 | score = (saturation + 0.1) * count 262 | 263 | if score > max_score: 264 | max_score = score 265 | dominant_color = (r, g, b) 266 | os.remove(os.path.join('1.jpg')) 267 | return dominant_color 268 | 269 | def hsv2rgb(h, s, v): 270 | 271 | h = float(h) 272 | s = float(s) 273 | v = float(v) 274 | h60 = h / 60.0 275 | h60f = math.floor(h60) 276 | hi = int(h60f) % 6 277 | f = h60 - h60f 278 | p = v * (1 - s) 279 | q = v * (1 - f * s) 280 | t = v * (1 - (1 - f) * s) 281 | r, g, b = 0, 0, 0 282 | if hi == 0: r, g, b = v, t, p 283 | elif hi == 1: r, g, b = q, v, p 284 | elif hi == 2: r, g, b = p, v, t 285 | elif hi == 3: r, g, b = p, q, v 286 | elif hi == 4: r, g, b = t, p, v 287 | elif hi == 5: r, g, b = v, p, q 288 | r, g, b = int(r * 255), int(g * 255), int(b * 255) 289 | return r, g, b 290 | 291 | def rgb2hsv(r, g, b): 292 | 293 | r, g, b = r/255.0, g/255.0, b/255.0 294 | mx = max(r, g, b) 295 | mn = min(r, g, b) 296 | df = mx-mn 297 | if mx == mn: 298 | h = 0 299 | elif mx == r: 300 | h = (60 * ((g-b)/df) + 360) % 360 301 | elif mx == g: 302 | h = (60 * ((b-r)/df) + 120) % 360 303 | elif mx == b: 304 | h = (60 * ((r-g)/df) + 240) % 360 305 | if mx == 0: 306 | s = 0 307 | else: 308 | s = df/mx 309 | v = mx 310 | return h, s, v 311 | 312 | def colorRGB(img_color): 313 | 314 | r = img_color[0] 315 | g = img_color[1] 316 | b = img_color[2] 317 | (h,s,v) = rgb2hsv(r, g, b) 318 | h = h + 90 319 | if h > 180: 320 | h = h - 180 321 | v = 1.0 - v 322 | (r,g,b) = hsv2rgb(h, s, v) 323 | font_color = (r,g,b) 324 | return font_color 325 | 326 | def generate_im(num_bg_images): 327 | 328 | bg = next(bgs) 329 | img_bg = bg * 255. 330 | bg_color = get_dominant_color(img_bg) 331 | font_color = colorRGB(bg_color) 332 | if font_color == (0,0,0): 333 | font_color = (1,1,1) 334 | fonts, font_char_ims= load_fonts(FONT_DIR, font_color) 335 | char_ims = font_char_ims[random.choice(fonts)] 336 | text, text_mask, code = generate_text(FONT_HEIGHT, char_ims) 337 | if len(code) < 5: 338 | M = make_affine_transform( 339 | from_shape=text.shape, 340 | to_shape=bg.shape, 341 | min_scale=0.2, 342 | max_scale=0.6, 343 | rotation_variation=0.6, 344 | scale_variation=1.2, 345 | translation_variation=0.6) 346 | else: 347 | M = make_affine_transform( 348 | from_shape=text.shape, 349 | to_shape=bg.shape, 350 | min_scale=0.5, 351 | max_scale=0.5, 352 | rotation_variation=0.1, 353 | scale_variation=0.2, 354 | translation_variation=0.2) 355 | ht, wt = text.shape[0], text.shape[1] 356 | 357 | corners_bf = numpy.matrix([[0, wt, 0, wt], 358 | [0, 0, ht, ht]]) 359 | text = cv2.warpAffine(text, M, (bg.shape[1], bg.shape[0])) 360 | corners_af = numpy.dot(M[:2, :2], corners_bf) + M[:2, -1] 361 | tl = numpy.min(corners_af, axis=1).T 362 | br = numpy.max(corners_af, axis=1).T 363 | box = numpy.hstack([tl, br]) 364 | 365 | rand = 230 366 | (h,s,v) = rgb2hsv(bg_color[0],bg_color[1],bg_color[2]) 367 | if v > 0.85 and v <= 1.0: 368 | out = bg -text*rand 369 | out[out<0] = 0 370 | else: 371 | out = text + bg 372 | out = cv2.resize(out, (bg.shape[1], bg.shape[0])) 373 | out = numpy.clip(out, 0., 1.) 374 | return out, code, box 375 | 376 | 377 | def load_fonts(folder_path,font_color): 378 | 379 | font_char_ims = {} 380 | fonts = [f for f in os.listdir(folder_path) if f.endswith('.ttf')] 381 | for font in fonts: 382 | font_char_ims[font] = dict(make_char_ims(os.path.join(folder_path, 383 | font), 384 | FONT_HEIGHT,font_color)) 385 | return fonts, font_char_ims 386 | 387 | 388 | def generate_ims(): 389 | ''' 390 | Generate number plate images. 391 | 392 | :return: 393 | Iterable of number plate images. 394 | 395 | ''' 396 | variation = 1.0 397 | 398 | while True: 399 | yield generate_im(num_bg_images) 400 | 401 | 402 | if __name__ == '__main__': 403 | 404 | Wfile = open(WORD_TXT,'r') 405 | point_load = 'point.txt' 406 | count = -1 407 | cnt = 0 408 | if not os.path.exists(point_load): 409 | filena = Wfile 410 | Train_file = open(train_lable, 'w') 411 | Test_file = open(test_lable, 'w') 412 | else: 413 | Train_file = open(train_lable, 'a') 414 | Test_file = open(test_lable, 'a') 415 | try: 416 | assert os.path.getsize(point_load) != 0 417 | except: 418 | print "the point file is None!!!" 419 | #return False 420 | sys.exit(0) 421 | point_file = open(point_load,'rb+') 422 | point = point_file.read() 423 | #print point 424 | cnt = int(point.split('_')[3].split('.')[0])+1 425 | point = point.split()[1] 426 | #print 'cnt = :',cnt 427 | for count,orgline in enumerate(Wfile): 428 | count += 1 429 | orgline=orgline.strip('\n') 430 | if orgline == point: 431 | break 432 | linecache.clearcache() 433 | filena = linecache.getlines(WORD_TXT)[count:] 434 | if filena == []: 435 | print "all datasets complete!!!" 436 | 437 | fname = BGS_DIR 438 | filenames = os.listdir(BGS_DIR) 439 | for fn in filenames: 440 | fullfilename = os.path.join(BGS_DIR,fn) 441 | bg = cv2.imread(fullfilename, cv2.CV_LOAD_IMAGE_COLOR) 442 | imgH = 500 443 | h, w = bg.shape[:2] 444 | ratio = w / float(h) 445 | imgW = int(ratio * imgH) 446 | res=cv2.resize(bg,(imgW,imgH),interpolation = cv2.INTER_CUBIC) 447 | cv2.imwrite(fullfilename, res) 448 | 449 | num_bg_images = opt.sumnumber 450 | bgs = generate_bg(BGS_DIR) 451 | 452 | for line in filena: 453 | CHARS = line.strip('\n').decode('utf-8') 454 | im_gen = itertools.islice(generate_ims(), num_bg_images) 455 | for img_idx, (im, c, bx) in enumerate(im_gen): 456 | im = im * 255. 457 | rimage ='{0}_{1:08d}.png'.format(opt.str,cnt) 458 | print rimage 459 | crop = im[int(bx[:, 1]):int(bx[:, 3]), int(bx[:, 0]):int(bx[:, 2]), ] 460 | 461 | imgH = 32 462 | h, w = crop.shape[:2] 463 | ratio = w / float(h) 464 | imgW = int(ratio * imgH) 465 | res=cv2.resize(crop,(imgW,imgH),interpolation = cv2.INTER_CUBIC) 466 | cv2.imwrite(R_OUTPUT_DIR+os.sep+rimage.encode('utf-8'), res) 467 | if img_idx % (opt.sumnumber) <= (opt.trainnum-1): 468 | Train_file.write(rimage.encode('utf-8') + ' ' + c.encode('utf-8') + '\n') 469 | Train_file.flush() 470 | else: 471 | Test_file.write(rimage.encode('utf-8') + ' ' + c.encode('utf-8') + '\n') 472 | Test_file.flush() 473 | cnt += 1 474 | point_file = open('point.txt','w') 475 | #print c.encode('utf-8') 476 | point_file.write(rimage.encode('utf-8') + ' ' + c.encode('utf-8')) 477 | point_file.flush() 478 | point_file.close() 479 | Train_file.close() 480 | Test_file.close() 481 | 482 | Wfile.close() -------------------------------------------------------------------------------- /sythdata.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | python gen_cn_txt.py \ 4 | --bgs=./bgs_1 \ 5 | --fonts=./fonts_cn \ 6 | --fh=48 \ 7 | --output=./datasets \ 8 | --label=./word.txt \ 9 | --trainlabel=./train.txt \ 10 | --vallabel=./val.txt \ 11 | --sumnumber=4 \ 12 | --trainnum=3 13 | -------------------------------------------------------------------------------- /word.txt: -------------------------------------------------------------------------------- 1 | 怀 2 | 茂 3 | 耀 4 | 涉 5 | 谈 6 | 伊 7 | 随 8 | 挂 9 | 帔 10 | 抗 11 | 料 12 | 蜚 13 | 洞 14 | 造 15 | 猢 16 | 嘤 17 | 缪 18 | 般 19 | 作 20 | 河 21 | 欲 22 | 临 23 | 然 24 | 电 25 | 场 26 | 宽 27 | 娼 28 | 线 29 | 捂 30 | 反 31 | 牌 32 | 雏 33 | 科 34 | 苗 35 | 纸 36 | 若 37 | 话 38 | 赞 39 | 凡 40 | 瓣 41 | 知 42 | 除 43 | 酬 44 | 惫 45 | 罪 46 | 揭 47 | 扬 48 | 衰 49 | 蹴 50 | 其 51 | 闹 52 | 驼 53 | 绿 54 | 渔 55 | 愁 56 | 萃 57 | 覆 58 | 乃 59 | 沌 60 | 颐 61 | 引 62 | 应 63 | 赅 64 | 枚 65 | 踟 66 | 厢 67 | 遇 68 | 崩 69 | 循 70 | 抬 71 | 是 72 | 讲 73 | 麟 74 | 咸 75 | 贞 76 | 鸿 77 | 视 78 | 俊 79 | 磐 80 | 寒 81 | 罕 82 | 黔 83 | 典 84 | 教 85 | 俎 86 | 也 87 | 睥 88 | 囤 89 | 秦 90 | 峨 91 | 忪 92 | 捭 93 | 景 94 | 诲 95 | 滴 96 | 凶 97 | 铸 98 | 须 99 | 孽 100 | 广 101 | 巾 102 | 沉 103 | 醋 104 | 上 105 | 后 106 | 频 107 | 餐 108 | 底 109 | 绘 110 | 蒙 111 | 攘 112 | 辟 113 | 箧 114 | 枯 115 | 惜 116 | 袱 117 | 足 118 | 伴 119 | 离 120 | 鬼 121 | 尾 122 | 胁 123 | 灿 124 | 框 125 | 泉 126 | 凋 127 | 蹊 128 | 壑 129 | 绕 130 | 罔 131 | 吸 132 | 虚 133 | 迟 134 | 牢 135 | 坤 136 | 拭 137 | 柯 138 | 棱 139 | 跳 140 | 轴 141 | 号 142 | 偶 143 | 畸 144 | 移 145 | 贾 146 | 竽 147 | 忿 148 | 老 149 | 膀 150 | 节 151 | 消 152 | 厌 153 | 咎 154 | 堑 155 | 怙 156 | 媒 157 | 肖 158 | 褛 159 | 濮 160 | 伟 161 | 冠 162 | 锣 163 | 颦 164 | 丝 165 | 纪 166 | 掬 167 | 术 168 | 辜 169 | 踵 170 | 吹 171 | 稽 172 | 吏 173 | 精 174 | 翅 175 | 拂 176 | 柄 177 | 汉 178 | 珍 179 | 克 180 | 今 181 | 前 182 | 双 183 | 坏 184 | 幕 185 | 盏 186 | 胖 187 | 呜 188 | 几 189 | 巨 190 | 绪 191 | 扭 192 | 杯 193 | 赳 194 | 卷 195 | 固 196 | 驽 197 | 导 198 | 齿 199 | 骁 200 | 脂 201 | 辉 202 | 丈 203 | 再 204 | 较 205 | 库 206 | 尔 207 | 挖 208 | 蔚 209 | 沟 210 | 删 211 | 嚣 212 | 睚 213 | 碧 214 | 披 215 | 亲 216 | 水 217 | 禽 218 | 岿 219 | 鼾 220 | 所 221 | 摄 222 | 蹈 223 | 勋 224 | 浊 225 | 重 226 | 灌 227 | 坎 228 | 篑 229 | 结 230 | 贻 231 | 噤 232 | 兢 233 | 学 234 | 翩 235 | 踽 236 | 臭 237 | 恬 238 | 诱 239 | 践 240 | 秽 241 | 胫 242 | 持 243 | 技 244 | 彪 245 | 标 246 | 殆 247 | 伉 248 | 予 249 | 越 250 | 雾 251 | 瞎 252 | 笑 253 | 妒 254 | 耗 255 | 辞 256 | 加 257 | 锥 258 | 咤 259 | 宦 260 | 弩 261 | 纨 262 | 悬 263 | 贵 264 | 霹 265 | 簿 266 | 晃 267 | 懂 268 | 故 269 | 蓄 270 | 识 271 | 免 272 | 城 273 | 筑 274 | 痹 275 | 秒 276 | 婷 277 | 荏 278 | 葸 279 | 江 280 | 连 281 | 狠 282 | 略 283 | 铤 284 | 芥 285 | 彩 286 | 扫 287 | 乳 288 | 赵 289 | 偷 290 | 叶 291 | 睹 292 | 相 293 | 驻 294 | 闺 295 | 好 296 | 忾 297 | 争 298 | 王 299 | 谊 300 | 傍 301 | 疏 302 | 骑 303 | 粕 304 | 踞 305 | 务 306 | 抱 307 | 垣 308 | 逢 309 | 钥 310 | 唤 311 | 禧 312 | 莫 313 | 榆 314 | 螳 315 | 斯 316 | 贴 317 | 冷 318 | 制 319 | 霸 320 | 礼 321 | 鸾 322 | 徊 323 | 擅 324 | 亘 325 | 友 326 | 煌 327 | 噎 328 | 子 329 | 蛙 330 | 诛 331 | 乞 332 | 狡 333 | 占 334 | 矣 335 | 绩 336 | 惭 337 | 普 338 | 殒 339 | 赴 340 | 缕 341 | 寻 342 | 饼 343 | 蜃 344 | 搅 345 | 薄 346 | 三 347 | 辈 348 | 逍 349 | 册 350 | 嚎 351 | 娑 352 | 缓 353 | 抖 354 | 昙 355 | 榜 356 | 负 357 | 圣 358 | 大 359 | 窦 360 | 鸩 361 | 挫 362 | 抢 363 | 支 364 | 暮 365 | 记 366 | 状 367 | 鬻 368 | 纾 369 | 权 370 | 殿 371 | 悠 372 | 义 373 | 迈 374 | 银 375 | 遍 376 | 里 377 | 畏 378 | 盎 379 | 寐 380 | 当 381 | 飒 382 | 展 383 | 鲁 384 | 拖 385 | 仞 386 | 珠 387 | 嗤 388 | 荐 389 | 荫 390 | 恭 391 | 臬 392 | 蛮 393 | 佳 394 | 具 395 | 铺 396 | 顽 397 | 肃 398 | 蜂 399 | 躇 400 | 丢 401 | 咋 402 | 芒 403 | 芬 404 | 墓 405 | 暗 406 | 耘 407 | 沛 408 | 依 409 | 东 410 | 吠 411 | 那 412 | 厥 413 | 判 414 | 座 415 | 枭 416 | 梳 417 | 段 418 | 嚷 419 | 熹 420 | 逸 421 | 区 422 | 羽 423 | 帼 424 | 旁 425 | 杂 426 | 菅 427 | 仇 428 | 浆 429 | 觉 430 | 案 431 | 矍 432 | 陌 433 | 煎 434 | 归 435 | 泛 436 | 保 437 | 面 438 | 句 439 | 继 440 | 碗 441 | 腮 442 | 深 443 | 诵 444 | 雷 445 | 峻 446 | 忽 447 | 幼 448 | 竿 449 | 考 450 | 螂 451 | 茅 452 | 万 453 | 殊 454 | 霍 455 | 鞍 456 | 徒 457 | 噩 458 | 肘 459 | 溜 460 | 拱 461 | 瀣 462 | 垢 463 | 天 464 | 墨 465 | 宪 466 | 音 467 | 贱 468 | 炸 469 | 恋 470 | 妾 471 | 恃 472 | 淆 473 | 雌 474 | 野 475 | 旖 476 | 遣 477 | 矢 478 | 勤 479 | 左 480 | 磨 481 | 葫 482 | 杭 483 | 良 484 | 泰 485 | 陷 486 | 兹 487 | 录 488 | 类 489 | 综 490 | 穿 491 | 绔 492 | 攀 493 | 昂 494 | 谆 495 | 喋 496 | 窕 497 | 笔 498 | 林 499 | 涛 500 | 戚 501 | 唠 502 | 筝 503 | 本 504 | 沱 505 | 串 506 | 点 507 | 刺 508 | 宿 509 | 担 510 | 过 511 | 豆 512 | 雍 513 | 姓 514 | 孔 515 | 潜 516 | 院 517 | 忧 518 | 票 519 | 走 520 | 烹 521 | 酸 522 | 牺 523 | 绽 524 | 彼 525 | 寿 526 | 顾 527 | 蚂 528 | 沆 529 | 栉 530 | 锋 531 | 炎 532 | 少 533 | 朗 534 | 耙 535 | 膘 536 | 洛 537 | 抚 538 | 渝 539 | 澜 540 | 馨 541 | 昭 542 | 振 543 | 躲 544 | 魔 545 | 帽 546 | 潇 547 | 览 548 | 降 549 | 协 550 | 郎 551 | 屑 552 | 恙 553 | 赛 554 | 九 555 | 远 556 | 俑 557 | 酣 558 | 团 559 | 剥 560 | 古 561 | 峦 562 | 药 563 | 惮 564 | 仲 565 | 说 566 | 坷 567 | 瓶 568 | 幽 569 | 翼 570 | 极 571 | 漆 572 | 殉 573 | 同 574 | 猎 575 | 战 576 | 脚 577 | 劣 578 | 冥 579 | 弦 580 | 太 581 | 断 582 | 搬 583 | 悯 584 | 辱 585 | 丰 586 | 洲 587 | 笼 588 | 眶 589 | 券 590 | 麻 591 | 润 592 | 渊 593 | 但 594 | 诉 595 | 痍 596 | 像 597 | 华 598 | 忑 599 | 髓 600 | 塔 601 | 托 602 | 碑 603 | 燥 604 | 舛 605 | 潦 606 | 旭 607 | 葬 608 | 惯 609 | 据 610 | 俱 611 | 买 612 | 叹 613 | 鱼 614 | 演 615 | 蚀 616 | 悄 617 | 阋 618 | 怖 619 | 和 620 | 透 621 | 庐 622 | 娓 623 | 夕 624 | 胯 625 | 折 626 | 丛 627 | 跄 628 | 簧 629 | 蹰 630 | 骨 631 | 怯 632 | 液 633 | 诫 634 | 匹 635 | 粼 636 | 宾 637 | 歉 638 | 陋 639 | 觊 640 | 偏 641 | 网 642 | 奕 643 | 麦 644 | 拘 645 | 诞 646 | 靡 647 | 因 648 | 入 649 | 虫 650 | 蓬 651 | 息 652 | 仰 653 | 瑕 654 | 幻 655 | 出 656 | 顿 657 | 蚁 658 | 蜀 659 | 踪 660 | 誉 661 | 鞋 662 | 熏 663 | 鼐 664 | 斗 665 | 芙 666 | 辛 667 | 兽 668 | 琢 669 | 傥 670 | 带 671 | 笨 672 | 堪 673 | 戮 674 | 估 675 | 讳 676 | 谲 677 | 褴 678 | 喷 679 | 嘶 680 | 犹 681 | 债 682 | 杀 683 | 情 684 | 掷 685 | 埋 686 | 响 687 | 界 688 | 减 689 | 黑 690 | 齐 691 | 寓 692 | 奔 693 | 旗 694 | 晖 695 | 拙 696 | 进 697 | 聚 698 | 妻 699 | 靠 700 | 口 701 | 呢 702 | 慧 703 | 巧 704 | 鹦 705 | 敬 706 | 扮 707 | 轰 708 | 闷 709 | 陶 710 | 卸 711 | 翻 712 | 蜉 713 | 姿 714 | 驾 715 | 烁 716 | 范 717 | 蒂 718 | 者 719 | 了 720 | 看 721 | 名 722 | 徐 723 | 鬓 724 | 粒 725 | 堕 726 | 馔 727 | 暖 728 | 掘 729 | 悚 730 | 椟 731 | 篡 732 | 鞠 733 | 钢 734 | 倥 735 | 冤 736 | 紧 737 | 约 738 | 末 739 | 搭 740 | 辰 741 | 男 742 | 鼻 743 | 尽 744 | 间 745 | 擂 746 | 浇 747 | 仆 748 | 苍 749 | 忐 750 | 硕 751 | 委 752 | 佛 753 | 惚 754 | 汝 755 | 襟 756 | 瓢 757 | 遥 758 | 凤 759 | 寨 760 | 乱 761 | 述 762 | 零 763 | 特 764 | 司 765 | 彻 766 | 图 767 | 饿 768 | 要 769 | 沃 770 | 辅 771 | 脆 772 | 序 773 | 崎 774 | 逐 775 | 钓 776 | 阔 777 | 悛 778 | 会 779 | 舜 780 | 晚 781 | 焦 782 | 被 783 | 训 784 | 溯 785 | 龊 786 | 尸 787 | 邻 788 | 强 789 | 弓 790 | 唾 791 | 见 792 | 血 793 | 迅 794 | 蹄 795 | 藉 796 | 磋 797 | 经 798 | 金 799 | 遐 800 | 卒 801 | 锱 802 | 喑 803 | 鹤 804 | 周 805 | 语 806 | 浮 807 | 恰 808 | 晴 809 | 饶 810 | 僻 811 | 调 812 | 妙 813 | 吓 814 | 隔 815 | 星 816 | 颠 817 | 客 818 | 弥 819 | 纤 820 | 璨 821 | 瞪 822 | 脱 823 | 魉 824 | 莲 825 | 朵 826 | 暴 827 | 岸 828 | 阿 829 | 疾 830 | 槊 831 | 扇 832 | 臆 833 | 灶 834 | 魍 835 | 嫌 836 | 鹏 837 | 遏 838 | 拜 839 | 屣 840 | 哨 841 | 衫 842 | 韪 843 | 菲 844 | 更 845 | 穷 846 | 饕 847 | 狼 848 | 梁 849 | 态 850 | 猪 851 | 溅 852 | 馋 853 | 窍 854 | 划 855 | 沙 856 | 业 857 | 芝 858 | 缤 859 | 倦 860 | 钩 861 | 用 862 | 侯 863 | 悱 864 | 朴 865 | 冻 866 | 吾 867 | 裁 868 | 睡 869 | 跃 870 | 仅 871 | 康 872 | 蓉 873 | 效 874 | 始 875 | 郑 876 | 雕 877 | 诗 878 | 荜 879 | 婢 880 | 馐 881 | 铩 882 | 噪 883 | 俯 884 | 腰 885 | 色 886 | 顶 887 | 击 888 | 清 889 | 辄 890 | 指 891 | 肆 892 | 悖 893 | 稍 894 | 完 895 | 式 896 | 逑 897 | 醐 898 | 袖 899 | 级 900 | 期 901 | 撞 902 | 群 903 | 邦 904 | 伯 905 | 找 906 | 爽 907 | 浃 908 | 久 909 | 妁 910 | 胆 911 | 奋 912 | 蛊 913 | 富 914 | 勒 915 | 狸 916 | 淘 917 | 滚 918 | 菜 919 | 束 920 | 擞 921 | 卧 922 | 烦 923 | 门 924 | 楫 925 | 雪 926 | 软 927 | 聱 928 | 眺 929 | 柴 930 | 壶 931 | 屹 932 | 养 933 | 建 934 | 睿 935 | 言 936 | 溃 937 | 超 938 | 最 939 | 枉 940 | 骋 941 | 妍 942 | 砌 943 | 鼎 944 | 玑 945 | 皓 946 | 儒 947 | 梗 948 | 辙 949 | 丘 950 | 抛 951 | 膝 952 | 怜 953 | 审 954 | 稠 955 | 纣 956 | 孚 957 | 尤 958 | 瞩 959 | 拟 960 | 羹 961 | 常 962 | 逼 963 | 证 964 | 仃 965 | 荆 966 | 立 967 | 种 968 | 塌 969 | 鳏 970 | 发 971 | 剐 972 | 罢 973 | 痕 974 | 疙 975 | 这 976 | 乘 977 | 招 978 | 杞 979 | 寡 980 | 绣 981 | 奢 982 | 工 983 | 僧 984 | 矩 985 | 器 986 | 番 987 | 泯 988 | 轮 989 | 艰 990 | 曳 991 | 幸 992 | 灼 993 | 铿 994 | 七 995 | 概 996 | 有 997 | 迭 998 | 程 999 | 复 --------------------------------------------------------------------------------