diff --git a/qurator/eynollah/eynollah.py b/qurator/eynollah/eynollah.py index f1e40f9..6956712 100644 --- a/qurator/eynollah/eynollah.py +++ b/qurator/eynollah/eynollah.py @@ -1447,40 +1447,6 @@ class Eynollah(): return prediction_textline[:, :, 0], prediction_textline_longshot_true_size[:, :, 0] - def do_work_of_slopes(self, q, poly, box_sub, boxes_per_process, textline_mask_tot, contours_per_process): - self.logger.debug('enter do_work_of_slopes') - slope_biggest = 0 - slopes_sub = [] - boxes_sub_new = [] - poly_sub = [] - for mv in range(len(boxes_per_process)): - crop_img, _ = crop_image_inside_box(boxes_per_process[mv], np.repeat(textline_mask_tot[:, :, np.newaxis], 3, axis=2)) - crop_img = crop_img[:, :, 0] - crop_img = cv2.erode(crop_img, KERNEL, iterations=2) - try: - textline_con, hierarchy = return_contours_of_image(crop_img) - textline_con_fil = filter_contours_area_of_image(crop_img, textline_con, hierarchy, max_area=1, min_area=0.0008) - y_diff_mean = find_contours_mean_y_diff(textline_con_fil) - sigma_des = max(1, int(y_diff_mean * (4.0 / 40.0))) - crop_img[crop_img > 0] = 1 - slope_corresponding_textregion = return_deskew_slop(crop_img, sigma_des, plotter=self.plotter) - except Exception as why: - self.logger.error(why) - slope_corresponding_textregion = MAX_SLOPE - - if slope_corresponding_textregion == MAX_SLOPE: - slope_corresponding_textregion = slope_biggest - slopes_sub.append(slope_corresponding_textregion) - - cnt_clean_rot = textline_contours_postprocessing(crop_img, slope_corresponding_textregion, contours_per_process[mv], boxes_per_process[mv]) - - poly_sub.append(cnt_clean_rot) - boxes_sub_new.append(boxes_per_process[mv]) - - q.put(slopes_sub) - poly.put(poly_sub) - box_sub.put(boxes_sub_new) - def get_regions_light_v(self,img,is_image_enhanced, num_col_classifier): self.logger.debug("enter get_regions_light_v") erosion_hurts = False diff --git a/qurator/eynollah/utils/__init__.py b/qurator/eynollah/utils/__init__.py index d2b2488..63d043a 100644 --- a/qurator/eynollah/utils/__init__.py +++ b/qurator/eynollah/utils/__init__.py @@ -531,192 +531,6 @@ def find_num_col(regions_without_separators, num_col_classifier, tables, multipl ##print(len(peaks_neg_true)) return len(peaks_neg_true), peaks_neg_true -def find_num_col_only_image(regions_without_separators, multiplier=3.8): - regions_without_separators_0 = regions_without_separators[:, :].sum(axis=0) - - ##plt.plot(regions_without_separators_0) - ##plt.show() - - sigma_ = 15 - - meda_n_updown = regions_without_separators_0[len(regions_without_separators_0) :: -1] - - first_nonzero = next((i for i, x in enumerate(regions_without_separators_0) if x), 0) - last_nonzero = next((i for i, x in enumerate(meda_n_updown) if x), 0) - - last_nonzero = len(regions_without_separators_0) - last_nonzero - - y = regions_without_separators_0 # [first_nonzero:last_nonzero] - - y_help = np.zeros(len(y) + 20) - - y_help[10 : len(y) + 10] = y - - x = np.array(range(len(y))) - - zneg_rev = -y_help + np.max(y_help) - - zneg = np.zeros(len(zneg_rev) + 20) - - zneg[10 : len(zneg_rev) + 10] = zneg_rev - - z = gaussian_filter1d(y, sigma_) - zneg = gaussian_filter1d(zneg, sigma_) - - peaks_neg, _ = find_peaks(zneg, height=0) - peaks, _ = find_peaks(z, height=0) - - peaks_neg = peaks_neg - 10 - 10 - - peaks_neg_org = np.copy(peaks_neg) - - peaks_neg = peaks_neg[(peaks_neg > first_nonzero) & (peaks_neg < last_nonzero)] - - peaks = peaks[(peaks > 0.09 * regions_without_separators.shape[1]) & (peaks < 0.91 * regions_without_separators.shape[1])] - - peaks_neg = peaks_neg[(peaks_neg > 500) & (peaks_neg < (regions_without_separators.shape[1] - 500))] - # print(peaks) - interest_pos = z[peaks] - - interest_pos = interest_pos[interest_pos > 10] - - interest_neg = z[peaks_neg] - min_peaks_pos = np.mean(interest_pos) # np.min(interest_pos) - min_peaks_neg = 0 # np.min(interest_neg) - - # $print(min_peaks_pos) - dis_talaei = (min_peaks_pos - min_peaks_neg) / multiplier - # print(interest_pos) - grenze = min_peaks_pos - dis_talaei # np.mean(y[peaks_neg[0]:peaks_neg[len(peaks_neg)-1]])-np.std(y[peaks_neg[0]:peaks_neg[len(peaks_neg)-1]])/2.0 - - interest_neg_fin = interest_neg[(interest_neg < grenze)] - peaks_neg_fin = peaks_neg[(interest_neg < grenze)] - - num_col = (len(interest_neg_fin)) + 1 - - p_l = 0 - p_u = len(y) - 1 - p_m = int(len(y) / 2.0) - p_g_l = int(len(y) / 3.0) - p_g_u = len(y) - int(len(y) / 3.0) - - if num_col == 3: - if (peaks_neg_fin[0] > p_g_u and peaks_neg_fin[1] > p_g_u) or (peaks_neg_fin[0] < p_g_l and peaks_neg_fin[1] < p_g_l) or (peaks_neg_fin[0] < p_m and peaks_neg_fin[1] < p_m) or (peaks_neg_fin[0] > p_m and peaks_neg_fin[1] > p_m): - num_col = 1 - else: - pass - - if num_col == 2: - if (peaks_neg_fin[0] > p_g_u) or (peaks_neg_fin[0] < p_g_l): - num_col = 1 - else: - pass - - diff_peaks = np.abs(np.diff(peaks_neg_fin)) - - cut_off = 400 - peaks_neg_true = [] - forest = [] - - for i in range(len(peaks_neg_fin)): - if i == 0: - forest.append(peaks_neg_fin[i]) - if i < (len(peaks_neg_fin) - 1): - if diff_peaks[i] <= cut_off: - forest.append(peaks_neg_fin[i + 1]) - if diff_peaks[i] > cut_off: - # print(forest[np.argmin(z[forest]) ] ) - if not isNaN(forest[np.argmin(z[forest])]): - peaks_neg_true.append(forest[np.argmin(z[forest])]) - forest = [] - forest.append(peaks_neg_fin[i + 1]) - if i == (len(peaks_neg_fin) - 1): - # print(print(forest[np.argmin(z[forest]) ] )) - if not isNaN(forest[np.argmin(z[forest])]): - peaks_neg_true.append(forest[np.argmin(z[forest])]) - - num_col = (len(peaks_neg_true)) + 1 - p_l = 0 - p_u = len(y) - 1 - p_m = int(len(y) / 2.0) - p_quarter = int(len(y) / 4.0) - p_g_l = int(len(y) / 3.0) - p_g_u = len(y) - int(len(y) / 3.0) - - p_u_quarter = len(y) - p_quarter - - if num_col == 3: - if (peaks_neg_true[0] > p_g_u and peaks_neg_true[1] > p_g_u) or (peaks_neg_true[0] < p_g_l and peaks_neg_true[1] < p_g_l) or (peaks_neg_true[0] < p_m and peaks_neg_true[1] < p_m) or (peaks_neg_true[0] > p_m and peaks_neg_true[1] > p_m): - num_col = 1 - peaks_neg_true = [] - elif (peaks_neg_true[0] < p_g_u and peaks_neg_true[0] > p_g_l) and (peaks_neg_true[1] > p_u_quarter): - peaks_neg_true = [peaks_neg_true[0]] - elif (peaks_neg_true[1] < p_g_u and peaks_neg_true[1] > p_g_l) and (peaks_neg_true[0] < p_quarter): - peaks_neg_true = [peaks_neg_true[1]] - else: - pass - - if num_col == 2: - if (peaks_neg_true[0] > p_g_u) or (peaks_neg_true[0] < p_g_l): - num_col = 1 - peaks_neg_true = [] - - if num_col == 4: - if len(np.array(peaks_neg_true)[np.array(peaks_neg_true) < p_g_l]) == 2 or len(np.array(peaks_neg_true)[np.array(peaks_neg_true) > (len(y) - p_g_l)]) == 2: - num_col = 1 - peaks_neg_true = [] - else: - pass - - # no deeper hill around found hills - - peaks_fin_true = [] - for i in range(len(peaks_neg_true)): - hill_main = peaks_neg_true[i] - # deep_depth=z[peaks_neg] - hills_around = peaks_neg_org[((peaks_neg_org > hill_main) & (peaks_neg_org <= hill_main + 400)) | ((peaks_neg_org < hill_main) & (peaks_neg_org >= hill_main - 400))] - deep_depth_around = z[hills_around] - - # print(hill_main,z[hill_main],hills_around,deep_depth_around,'manoooo') - try: - if np.min(deep_depth_around) < z[hill_main]: - pass - else: - peaks_fin_true.append(hill_main) - except: - pass - - diff_peaks_annormal = diff_peaks[diff_peaks < 360] - - if len(diff_peaks_annormal) > 0: - arg_help = np.array(range(len(diff_peaks))) - arg_help_ann = arg_help[diff_peaks < 360] - - peaks_neg_fin_new = [] - - for ii in range(len(peaks_neg_fin)): - if ii in arg_help_ann: - arg_min = np.argmin([interest_neg_fin[ii], interest_neg_fin[ii + 1]]) - if arg_min == 0: - peaks_neg_fin_new.append(peaks_neg_fin[ii]) - else: - peaks_neg_fin_new.append(peaks_neg_fin[ii + 1]) - - elif (ii - 1) in arg_help_ann: - pass - else: - peaks_neg_fin_new.append(peaks_neg_fin[ii]) - else: - peaks_neg_fin_new = peaks_neg_fin - - # sometime pages with one columns gives also some negative peaks. delete those peaks - param = z[peaks_neg_true] / float(min_peaks_pos) * 100 - - if len(param[param <= 41]) == 0: - peaks_neg_true = [] - - return len(peaks_fin_true), peaks_fin_true - def find_num_col_by_vertical_lines(regions_without_separators, multiplier=3.8): regions_without_separators_0 = regions_without_separators[:, :, 0].sum(axis=0) diff --git a/qurator/eynollah/utils/contour.py b/qurator/eynollah/utils/contour.py index 53b39b5..27bdfa0 100644 --- a/qurator/eynollah/utils/contour.py +++ b/qurator/eynollah/utils/contour.py @@ -171,35 +171,6 @@ def do_work_of_contours_in_image(queue_of_all_params, contours_per_process, inde queue_of_all_params.put([ cnts_org_per_each_subprocess, index_by_text_region_contours]) -def get_textregion_contours_in_org_image_multi(cnts, img, slope_first): - - num_cores = cpu_count() - queue_of_all_params = Queue() - - processes = [] - nh = np.linspace(0, len(cnts), num_cores + 1) - indexes_by_text_con = np.array(range(len(cnts))) - for i in range(num_cores): - contours_per_process = cnts[int(nh[i]) : int(nh[i + 1])] - indexes_text_con_per_process = indexes_by_text_con[int(nh[i]) : int(nh[i + 1])] - - processes.append(Process(target=do_work_of_contours_in_image, args=(queue_of_all_params, contours_per_process, indexes_text_con_per_process, img,slope_first ))) - for i in range(num_cores): - processes[i].start() - cnts_org = [] - all_index_text_con = [] - for i in range(num_cores): - list_all_par = queue_of_all_params.get(True) - contours_for_sub_process = list_all_par[0] - indexes_for_sub_process = list_all_par[1] - for j in range(len(contours_for_sub_process)): - cnts_org.append(contours_for_sub_process[j]) - all_index_text_con.append(indexes_for_sub_process[j]) - for i in range(num_cores): - processes[i].join() - - print(all_index_text_con) - return cnts_org def loop_contour_image(index_l, cnts,img, slope_first): img_copy = np.zeros(img.shape) img_copy = cv2.fillPoly(img_copy, pts=[cnts[index_l]], color=(1, 1, 1)) diff --git a/qurator/eynollah/utils/separate_lines.py b/qurator/eynollah/utils/separate_lines.py index acdc2e9..f338fb6 100644 --- a/qurator/eynollah/utils/separate_lines.py +++ b/qurator/eynollah/utils/separate_lines.py @@ -17,114 +17,6 @@ from . import ( isNaN, ) -def dedup_separate_lines(img_patch, contour_text_interest, thetha, axis): - (h, w) = img_patch.shape[:2] - center = (w // 2, h // 2) - M = cv2.getRotationMatrix2D(center, -thetha, 1.0) - x_d = M[0, 2] - y_d = M[1, 2] - - thetha = thetha / 180.0 * np.pi - rotation_matrix = np.array([[np.cos(thetha), -np.sin(thetha)], [np.sin(thetha), np.cos(thetha)]]) - - x_cont = contour_text_interest[:, 0, 0] - y_cont = contour_text_interest[:, 0, 1] - x_cont = x_cont - np.min(x_cont) - y_cont = y_cont - np.min(y_cont) - - x_min_cont = 0 - x_max_cont = img_patch.shape[1] - y_min_cont = 0 - y_max_cont = img_patch.shape[0] - - xv = np.linspace(x_min_cont, x_max_cont, 1000) - - textline_patch_sum_along_width = img_patch.sum(axis=axis) - - first_nonzero = 0 # (next((i for i, x in enumerate(mada_n) if x), None)) - - y = textline_patch_sum_along_width[:] # [first_nonzero:last_nonzero] - y_padded = np.zeros(len(y) + 40) - y_padded[20 : len(y) + 20] = y - x = np.array(range(len(y))) - - peaks_real, _ = find_peaks(gaussian_filter1d(y, 3), height=0) - - if 1 > 0: - - try: - - y_padded_smoothed_e = gaussian_filter1d(y_padded, 2) - y_padded_up_to_down_e = -y_padded + np.max(y_padded) - y_padded_up_to_down_padded_e = np.zeros(len(y_padded_up_to_down_e) + 40) - y_padded_up_to_down_padded_e[20 : len(y_padded_up_to_down_e) + 20] = y_padded_up_to_down_e - y_padded_up_to_down_padded_e = gaussian_filter1d(y_padded_up_to_down_padded_e, 2) - - peaks_e, _ = find_peaks(y_padded_smoothed_e, height=0) - peaks_neg_e, _ = find_peaks(y_padded_up_to_down_padded_e, height=0) - neg_peaks_max = np.max(y_padded_up_to_down_padded_e[peaks_neg_e]) - - arg_neg_must_be_deleted = np.array(range(len(peaks_neg_e)))[y_padded_up_to_down_padded_e[peaks_neg_e] / float(neg_peaks_max) < 0.3] - diff_arg_neg_must_be_deleted = np.diff(arg_neg_must_be_deleted) - - arg_diff = np.array(range(len(diff_arg_neg_must_be_deleted))) - arg_diff_cluster = arg_diff[diff_arg_neg_must_be_deleted > 1] - - peaks_new = peaks_e[:] - peaks_neg_new = peaks_neg_e[:] - - clusters_to_be_deleted = [] - if len(arg_diff_cluster) > 0: - - clusters_to_be_deleted.append(arg_neg_must_be_deleted[0 : arg_diff_cluster[0] + 1]) - for i in range(len(arg_diff_cluster) - 1): - clusters_to_be_deleted.append(arg_neg_must_be_deleted[arg_diff_cluster[i] + 1 : arg_diff_cluster[i + 1] + 1]) - clusters_to_be_deleted.append(arg_neg_must_be_deleted[arg_diff_cluster[len(arg_diff_cluster) - 1] + 1 :]) - - if len(clusters_to_be_deleted) > 0: - peaks_new_extra = [] - for m in range(len(clusters_to_be_deleted)): - min_cluster = np.min(peaks_e[clusters_to_be_deleted[m]]) - max_cluster = np.max(peaks_e[clusters_to_be_deleted[m]]) - peaks_new_extra.append(int((min_cluster + max_cluster) / 2.0)) - for m1 in range(len(clusters_to_be_deleted[m])): - peaks_new = peaks_new[peaks_new != peaks_e[clusters_to_be_deleted[m][m1] - 1]] - peaks_new = peaks_new[peaks_new != peaks_e[clusters_to_be_deleted[m][m1]]] - - peaks_neg_new = peaks_neg_new[peaks_neg_new != peaks_neg_e[clusters_to_be_deleted[m][m1]]] - peaks_new_tot = [] - for i1 in peaks_new: - peaks_new_tot.append(i1) - for i1 in peaks_new_extra: - peaks_new_tot.append(i1) - peaks_new_tot = np.sort(peaks_new_tot) - - else: - peaks_new_tot = peaks_e[:] - - textline_con, hierarchy = return_contours_of_image(img_patch) - textline_con_fil = filter_contours_area_of_image(img_patch, textline_con, hierarchy, max_area=1, min_area=0.0008) - y_diff_mean = np.mean(np.diff(peaks_new_tot)) # self.find_contours_mean_y_diff(textline_con_fil) - - sigma_gaus = int(y_diff_mean * (7.0 / 40.0)) - # print(sigma_gaus,'sigma_gaus') - except: - sigma_gaus = 12 - if sigma_gaus < 3: - sigma_gaus = 3 - # print(sigma_gaus,'sigma') - - y_padded_smoothed = gaussian_filter1d(y_padded, sigma_gaus) - y_padded_up_to_down = -y_padded + np.max(y_padded) - y_padded_up_to_down_padded = np.zeros(len(y_padded_up_to_down) + 40) - y_padded_up_to_down_padded[20 : len(y_padded_up_to_down) + 20] = y_padded_up_to_down - y_padded_up_to_down_padded = gaussian_filter1d(y_padded_up_to_down_padded, sigma_gaus) - - peaks, _ = find_peaks(y_padded_smoothed, height=0) - peaks_neg, _ = find_peaks(y_padded_up_to_down_padded, height=0) - - return x, y, x_d, y_d, xv, x_min_cont, y_min_cont, x_max_cont, y_max_cont, first_nonzero, y_padded_up_to_down_padded, y_padded_smoothed, peaks, peaks_neg, rotation_matrix - def separate_lines(img_patch, contour_text_interest, thetha, x_help, y_help): (h, w) = img_patch.shape[:2] @@ -671,303 +563,6 @@ def separate_lines(img_patch, contour_text_interest, thetha, x_help, y_help): return peaks, textline_boxes_rot -def separate_lines_vertical(img_patch, contour_text_interest, thetha): - - thetha = thetha + 90 - contour_text_interest_copy = contour_text_interest.copy() - x, y, x_d, y_d, xv, x_min_cont, y_min_cont, x_max_cont, y_max_cont, first_nonzero, y_padded_up_to_down_padded, y_padded_smoothed, peaks, peaks_neg, rotation_matrix = dedup_separate_lines(img_patch, contour_text_interest, thetha, 0) - - - # plt.plot(y_padded_up_to_down_padded) - # plt.plot(peaks_neg,y_padded_up_to_down_padded[peaks_neg],'*') - # plt.title('negs') - # plt.show() - - # plt.plot(y_padded_smoothed) - # plt.plot(peaks,y_padded_smoothed[peaks],'*') - # plt.title('poss') - # plt.show() - - neg_peaks_max = np.max(y_padded_up_to_down_padded[peaks_neg]) - - arg_neg_must_be_deleted = np.array(range(len(peaks_neg)))[y_padded_up_to_down_padded[peaks_neg] / float(neg_peaks_max) < 0.42] - - diff_arg_neg_must_be_deleted = np.diff(arg_neg_must_be_deleted) - - arg_diff = np.array(range(len(diff_arg_neg_must_be_deleted))) - arg_diff_cluster = arg_diff[diff_arg_neg_must_be_deleted > 1] - - peaks_new = peaks[:] - peaks_neg_new = peaks_neg[:] - clusters_to_be_deleted = [] - - if len(arg_diff_cluster) >= 2 and len(arg_diff_cluster) > 0: - - clusters_to_be_deleted.append(arg_neg_must_be_deleted[0 : arg_diff_cluster[0] + 1]) - for i in range(len(arg_diff_cluster) - 1): - clusters_to_be_deleted.append(arg_neg_must_be_deleted[arg_diff_cluster[i] + 1 : arg_diff_cluster[i + 1] + 1]) - clusters_to_be_deleted.append(arg_neg_must_be_deleted[arg_diff_cluster[len(arg_diff_cluster) - 1] + 1 :]) - elif len(arg_neg_must_be_deleted) >= 2 and len(arg_diff_cluster) == 0: - clusters_to_be_deleted.append(arg_neg_must_be_deleted[:]) - - if len(arg_neg_must_be_deleted) == 1: - clusters_to_be_deleted.append(arg_neg_must_be_deleted) - - if len(clusters_to_be_deleted) > 0: - peaks_new_extra = [] - for m in range(len(clusters_to_be_deleted)): - min_cluster = np.min(peaks[clusters_to_be_deleted[m]]) - max_cluster = np.max(peaks[clusters_to_be_deleted[m]]) - peaks_new_extra.append(int((min_cluster + max_cluster) / 2.0)) - for m1 in range(len(clusters_to_be_deleted[m])): - peaks_new = peaks_new[peaks_new != peaks[clusters_to_be_deleted[m][m1] - 1]] - peaks_new = peaks_new[peaks_new != peaks[clusters_to_be_deleted[m][m1]]] - - peaks_neg_new = peaks_neg_new[peaks_neg_new != peaks_neg[clusters_to_be_deleted[m][m1]]] - peaks_new_tot = [] - for i1 in peaks_new: - peaks_new_tot.append(i1) - for i1 in peaks_new_extra: - peaks_new_tot.append(i1) - peaks_new_tot = np.sort(peaks_new_tot) - - peaks = peaks_new_tot[:] - peaks_neg = peaks_neg_new[:] - - else: - peaks_new_tot = peaks[:] - peaks = peaks_new_tot[:] - peaks_neg = peaks_neg_new[:] - - mean_value_of_peaks = np.mean(y_padded_smoothed[peaks]) - std_value_of_peaks = np.std(y_padded_smoothed[peaks]) - peaks_values = y_padded_smoothed[peaks] - - peaks_neg = peaks_neg - 20 - 20 - peaks = peaks - 20 - - for jj in range(len(peaks_neg)): - if peaks_neg[jj] > len(x) - 1: - peaks_neg[jj] = len(x) - 1 - - for jj in range(len(peaks)): - if peaks[jj] > len(x) - 1: - peaks[jj] = len(x) - 1 - - textline_boxes = [] - textline_boxes_rot = [] - - if len(peaks_neg) == len(peaks) + 1 and len(peaks) >= 3: - # print('11') - for jj in range(len(peaks)): - - if jj == (len(peaks) - 1): - dis_to_next_up = abs(peaks[jj] - peaks_neg[jj]) - dis_to_next_down = abs(peaks[jj] - peaks_neg[jj + 1]) - - if peaks_values[jj] > mean_value_of_peaks - std_value_of_peaks / 2.0: - point_up = peaks[jj] + first_nonzero - int(1.3 * dis_to_next_up) ##+int(dis_to_next_up*1./4.0) - point_down = x_max_cont - 1 ##peaks[jj] + first_nonzero + int(1.3 * dis_to_next_down) #point_up# np.max(y_cont)#peaks[jj] + first_nonzero + int(1.4 * dis_to_next_down) ###-int(dis_to_next_down*1./4.0) - else: - point_up = peaks[jj] + first_nonzero - int(1.4 * dis_to_next_up) ##+int(dis_to_next_up*1./4.0) - point_down = x_max_cont - 1 ##peaks[jj] + first_nonzero + int(1.6 * dis_to_next_down) #point_up# np.max(y_cont)#peaks[jj] + first_nonzero + int(1.4 * dis_to_next_down) ###-int(dis_to_next_down*1./4.0) - - point_down_narrow = peaks[jj] + first_nonzero + int(1.4 * dis_to_next_down) ###-int(dis_to_next_down*1./2) - else: - dis_to_next_up = abs(peaks[jj] - peaks_neg[jj]) - dis_to_next_down = abs(peaks[jj] - peaks_neg[jj + 1]) - - if peaks_values[jj] > mean_value_of_peaks - std_value_of_peaks / 2.0: - point_up = peaks[jj] + first_nonzero - int(1.1 * dis_to_next_up) ##+int(dis_to_next_up*1./4.0) - point_down = peaks[jj] + first_nonzero + int(1.1 * dis_to_next_down) ###-int(dis_to_next_down*1./4.0) - else: - point_up = peaks[jj] + first_nonzero - int(1.23 * dis_to_next_up) ##+int(dis_to_next_up*1./4.0) - point_down = peaks[jj] + first_nonzero + int(1.33 * dis_to_next_down) ###-int(dis_to_next_down*1./4.0) - - point_down_narrow = peaks[jj] + first_nonzero + int(1.1 * dis_to_next_down) ###-int(dis_to_next_down*1./2) - - if point_down_narrow >= img_patch.shape[0]: - point_down_narrow = img_patch.shape[0] - 2 - - distances = [cv2.pointPolygonTest(contour_text_interest_copy, tuple(int(x) for x in np.array([xv[mj], peaks[jj] + first_nonzero])), True) for mj in range(len(xv))] - distances = np.array(distances) - - xvinside = xv[distances >= 0] - - if len(xvinside) == 0: - x_min = x_min_cont - x_max = x_max_cont - else: - x_min = np.min(xvinside) # max(x_min_interest,x_min_cont) - x_max = np.max(xvinside) # min(x_max_interest,x_max_cont) - - p1 = np.dot(rotation_matrix, [int(point_up), int(y_min_cont)]) - p2 = np.dot(rotation_matrix, [int(point_down), int(y_min_cont)]) - p3 = np.dot(rotation_matrix, [int(point_down), int(y_max_cont)]) - p4 = np.dot(rotation_matrix, [int(point_up), int(y_max_cont)]) - - x_min_rot1, point_up_rot1 = p1[0] + x_d, p1[1] + y_d - x_max_rot2, point_up_rot2 = p2[0] + x_d, p2[1] + y_d - x_max_rot3, point_down_rot3 = p3[0] + x_d, p3[1] + y_d - x_min_rot4, point_down_rot4 = p4[0] + x_d, p4[1] + y_d - - if x_min_rot1 < 0: - x_min_rot1 = 0 - if x_min_rot4 < 0: - x_min_rot4 = 0 - if point_up_rot1 < 0: - point_up_rot1 = 0 - if point_up_rot2 < 0: - point_up_rot2 = 0 - - textline_boxes_rot.append(np.array([[int(x_min_rot1), int(point_up_rot1)], [int(x_max_rot2), int(point_up_rot2)], [int(x_max_rot3), int(point_down_rot3)], [int(x_min_rot4), int(point_down_rot4)]])) - - textline_boxes.append(np.array([[int(x_min), int(point_up)], [int(x_max), int(point_up)], [int(x_max), int(point_down)], [int(x_min), int(point_down)]])) - - elif len(peaks) < 1: - pass - - elif len(peaks) == 1: - x_min = x_min_cont - x_max = x_max_cont - - y_min = y_min_cont - y_max = y_max_cont - - p1 = np.dot(rotation_matrix, [int(point_up), int(y_min_cont)]) - p2 = np.dot(rotation_matrix, [int(point_down), int(y_min_cont)]) - p3 = np.dot(rotation_matrix, [int(point_down), int(y_max_cont)]) - p4 = np.dot(rotation_matrix, [int(point_up), int(y_max_cont)]) - - x_min_rot1, point_up_rot1 = p1[0] + x_d, p1[1] + y_d - x_max_rot2, point_up_rot2 = p2[0] + x_d, p2[1] + y_d - x_max_rot3, point_down_rot3 = p3[0] + x_d, p3[1] + y_d - x_min_rot4, point_down_rot4 = p4[0] + x_d, p4[1] + y_d - - if x_min_rot1 < 0: - x_min_rot1 = 0 - if x_min_rot4 < 0: - x_min_rot4 = 0 - if point_up_rot1 < 0: - point_up_rot1 = 0 - if point_up_rot2 < 0: - point_up_rot2 = 0 - - textline_boxes_rot.append(np.array([[int(x_min_rot1), int(point_up_rot1)], [int(x_max_rot2), int(point_up_rot2)], [int(x_max_rot3), int(point_down_rot3)], [int(x_min_rot4), int(point_down_rot4)]])) - - textline_boxes.append(np.array([[int(x_min), int(y_min)], [int(x_max), int(y_min)], [int(x_max), int(y_max)], [int(x_min), int(y_max)]])) - - elif len(peaks) == 2: - dis_to_next = np.abs(peaks[1] - peaks[0]) - for jj in range(len(peaks)): - if jj == 0: - point_up = 0 # peaks[jj] + first_nonzero - int(1. / 1.7 * dis_to_next) - if point_up < 0: - point_up = 1 - point_down = peaks[jj] + first_nonzero + int(1.0 / 1.8 * dis_to_next) - elif jj == 1: - point_down = peaks[jj] + first_nonzero + int(1.0 / 1.8 * dis_to_next) - if point_down >= img_patch.shape[0]: - point_down = img_patch.shape[0] - 2 - point_up = peaks[jj] + first_nonzero - int(1.0 / 1.8 * dis_to_next) - - distances = [cv2.pointPolygonTest(contour_text_interest_copy, tuple(int(x) for x in np.array([xv[mj], peaks[jj] + first_nonzero])), True) for mj in range(len(xv))] - distances = np.array(distances) - - xvinside = xv[distances >= 0] - - if len(xvinside) == 0: - x_min = x_min_cont - x_max = x_max_cont - else: - x_min = np.min(xvinside) - x_max = np.max(xvinside) - - p1 = np.dot(rotation_matrix, [int(point_up), int(y_min_cont)]) - p2 = np.dot(rotation_matrix, [int(point_down), int(y_min_cont)]) - p3 = np.dot(rotation_matrix, [int(point_down), int(y_max_cont)]) - p4 = np.dot(rotation_matrix, [int(point_up), int(y_max_cont)]) - - x_min_rot1, point_up_rot1 = p1[0] + x_d, p1[1] + y_d - x_max_rot2, point_up_rot2 = p2[0] + x_d, p2[1] + y_d - x_max_rot3, point_down_rot3 = p3[0] + x_d, p3[1] + y_d - x_min_rot4, point_down_rot4 = p4[0] + x_d, p4[1] + y_d - - if x_min_rot1 < 0: - x_min_rot1 = 0 - if x_min_rot4 < 0: - x_min_rot4 = 0 - if point_up_rot1 < 0: - point_up_rot1 = 0 - if point_up_rot2 < 0: - point_up_rot2 = 0 - - textline_boxes_rot.append(np.array([[int(x_min_rot1), int(point_up_rot1)], [int(x_max_rot2), int(point_up_rot2)], [int(x_max_rot3), int(point_down_rot3)], [int(x_min_rot4), int(point_down_rot4)]])) - - textline_boxes.append(np.array([[int(x_min), int(point_up)], [int(x_max), int(point_up)], [int(x_max), int(point_down)], [int(x_min), int(point_down)]])) - else: - for jj in range(len(peaks)): - - if jj == 0: - dis_to_next = peaks[jj + 1] - peaks[jj] - # point_up=peaks[jj]+first_nonzero-int(1./3*dis_to_next) - point_up = peaks[jj] + first_nonzero - int(1.0 / 1.9 * dis_to_next) - if point_up < 0: - point_up = 1 - # point_down=peaks[jj]+first_nonzero+int(1./3*dis_to_next) - point_down = peaks[jj] + first_nonzero + int(1.0 / 1.9 * dis_to_next) - elif jj == len(peaks) - 1: - dis_to_next = peaks[jj] - peaks[jj - 1] - # point_down=peaks[jj]+first_nonzero+int(1./3*dis_to_next) - point_down = peaks[jj] + first_nonzero + int(1.0 / 1.7 * dis_to_next) - if point_down >= img_patch.shape[0]: - point_down = img_patch.shape[0] - 2 - # point_up=peaks[jj]+first_nonzero-int(1./3*dis_to_next) - point_up = peaks[jj] + first_nonzero - int(1.0 / 1.9 * dis_to_next) - else: - dis_to_next_down = peaks[jj + 1] - peaks[jj] - dis_to_next_up = peaks[jj] - peaks[jj - 1] - - point_up = peaks[jj] + first_nonzero - int(1.0 / 1.9 * dis_to_next_up) - point_down = peaks[jj] + first_nonzero + int(1.0 / 1.9 * dis_to_next_down) - - distances = [cv2.pointPolygonTest(contour_text_interest_copy, tuple(int(x) for x in np.array([xv[mj], peaks[jj] + first_nonzero])), True) for mj in range(len(xv))] - distances = np.array(distances) - - xvinside = xv[distances >= 0] - - if len(xvinside) == 0: - x_min = x_min_cont - x_max = x_max_cont - else: - x_min = np.min(xvinside) # max(x_min_interest,x_min_cont) - x_max = np.max(xvinside) # min(x_max_interest,x_max_cont) - - p1 = np.dot(rotation_matrix, [int(point_up), int(y_min_cont)]) - p2 = np.dot(rotation_matrix, [int(point_down), int(y_min_cont)]) - p3 = np.dot(rotation_matrix, [int(point_down), int(y_max_cont)]) - p4 = np.dot(rotation_matrix, [int(point_up), int(y_max_cont)]) - - x_min_rot1, point_up_rot1 = p1[0] + x_d, p1[1] + y_d - x_max_rot2, point_up_rot2 = p2[0] + x_d, p2[1] + y_d - x_max_rot3, point_down_rot3 = p3[0] + x_d, p3[1] + y_d - x_min_rot4, point_down_rot4 = p4[0] + x_d, p4[1] + y_d - - if x_min_rot1 < 0: - x_min_rot1 = 0 - if x_min_rot4 < 0: - x_min_rot4 = 0 - if point_up_rot1 < 0: - point_up_rot1 = 0 - if point_up_rot2 < 0: - point_up_rot2 = 0 - - textline_boxes_rot.append(np.array([[int(x_min_rot1), int(point_up_rot1)], [int(x_max_rot2), int(point_up_rot2)], [int(x_max_rot3), int(point_down_rot3)], [int(x_min_rot4), int(point_down_rot4)]])) - - textline_boxes.append(np.array([[int(x_min), int(point_up)], [int(x_max), int(point_up)], [int(x_max), int(point_down)], [int(x_min), int(point_down)]])) - - return peaks, textline_boxes_rot - def separate_lines_new_inside_tiles2(img_patch, thetha): (h, w) = img_patch.shape[:2] @@ -1183,149 +778,6 @@ def separate_lines_new_inside_tiles2(img_patch, thetha): img_patch = cv2.erode(img_patch, kernel, iterations=1) return img_patch -def separate_lines_new_inside_tiles(img_path, thetha): - (h, w) = img_path.shape[:2] - center = (w // 2, h // 2) - M = cv2.getRotationMatrix2D(center, -thetha, 1.0) - x_d = M[0, 2] - y_d = M[1, 2] - - thetha = thetha / 180.0 * np.pi - rotation_matrix = np.array([[np.cos(thetha), -np.sin(thetha)], [np.sin(thetha), np.cos(thetha)]]) - - x_min_cont = 0 - x_max_cont = img_path.shape[1] - y_min_cont = 0 - y_max_cont = img_path.shape[0] - - xv = np.linspace(x_min_cont, x_max_cont, 1000) - - mada_n = img_path.sum(axis=1) - - ##plt.plot(mada_n) - ##plt.show() - - first_nonzero = 0 # (next((i for i, x in enumerate(mada_n) if x), None)) - - y = mada_n[:] # [first_nonzero:last_nonzero] - y_help = np.zeros(len(y) + 40) - y_help[20 : len(y) + 20] = y - x = np.array(range(len(y))) - - peaks_real, _ = find_peaks(gaussian_filter1d(y, 3), height=0) - if len(peaks_real) <= 2 and len(peaks_real) > 1: - sigma_gaus = 10 - else: - sigma_gaus = 5 - - z = gaussian_filter1d(y_help, sigma_gaus) - zneg_rev = -y_help + np.max(y_help) - zneg = np.zeros(len(zneg_rev) + 40) - zneg[20 : len(zneg_rev) + 20] = zneg_rev - zneg = gaussian_filter1d(zneg, sigma_gaus) - - peaks, _ = find_peaks(z, height=0) - peaks_neg, _ = find_peaks(zneg, height=0) - - for nn in range(len(peaks_neg)): - if peaks_neg[nn] > len(z) - 1: - peaks_neg[nn] = len(z) - 1 - if peaks_neg[nn] < 0: - peaks_neg[nn] = 0 - - diff_peaks = np.abs(np.diff(peaks_neg)) - - cut_off = 20 - peaks_neg_true = [] - forest = [] - - for i in range(len(peaks_neg)): - if i == 0: - forest.append(peaks_neg[i]) - if i < (len(peaks_neg) - 1): - if diff_peaks[i] <= cut_off: - forest.append(peaks_neg[i + 1]) - if diff_peaks[i] > cut_off: - # print(forest[np.argmin(z[forest]) ] ) - if not isNaN(forest[np.argmin(z[forest])]): - peaks_neg_true.append(forest[np.argmin(z[forest])]) - forest = [] - forest.append(peaks_neg[i + 1]) - if i == (len(peaks_neg) - 1): - # print(print(forest[np.argmin(z[forest]) ] )) - if not isNaN(forest[np.argmin(z[forest])]): - peaks_neg_true.append(forest[np.argmin(z[forest])]) - - diff_peaks_pos = np.abs(np.diff(peaks)) - - cut_off = 20 - peaks_pos_true = [] - forest = [] - - for i in range(len(peaks)): - if i == 0: - forest.append(peaks[i]) - if i < (len(peaks) - 1): - if diff_peaks_pos[i] <= cut_off: - forest.append(peaks[i + 1]) - if diff_peaks_pos[i] > cut_off: - # print(forest[np.argmin(z[forest]) ] ) - if not isNaN(forest[np.argmax(z[forest])]): - peaks_pos_true.append(forest[np.argmax(z[forest])]) - forest = [] - forest.append(peaks[i + 1]) - if i == (len(peaks) - 1): - # print(print(forest[np.argmin(z[forest]) ] )) - if not isNaN(forest[np.argmax(z[forest])]): - peaks_pos_true.append(forest[np.argmax(z[forest])]) - - # print(len(peaks_neg_true) ,len(peaks_pos_true) ,'lensss') - - if len(peaks_neg_true) > 0: - peaks_neg_true = np.array(peaks_neg_true) - """ - #plt.figure(figsize=(40,40)) - #plt.subplot(1,2,1) - #plt.title('Textline segmentation von Textregion') - #plt.imshow(img_path) - #plt.xlabel('X') - #plt.ylabel('Y') - #plt.subplot(1,2,2) - #plt.title('Dichte entlang X') - #base = pyplot.gca().transData - #rot = transforms.Affine2D().rotate_deg(90) - #plt.plot(zneg,np.array(range(len(zneg)))) - #plt.plot(zneg[peaks_neg_true],peaks_neg_true,'*') - #plt.gca().invert_yaxis() - - #plt.xlabel('Dichte') - #plt.ylabel('Y') - ##plt.plot([0,len(y)], [grenze,grenze]) - #plt.show() - """ - peaks_neg_true = peaks_neg_true - 20 - 20 - - # print(peaks_neg_true) - for i in range(len(peaks_neg_true)): - img_path[peaks_neg_true[i] - 6 : peaks_neg_true[i] + 6, :] = 0 - - else: - pass - - if len(peaks_pos_true) > 0: - peaks_pos_true = np.array(peaks_pos_true) - peaks_pos_true = peaks_pos_true - 20 - - for i in range(len(peaks_pos_true)): - img_path[peaks_pos_true[i] - 8 : peaks_pos_true[i] + 8, :] = 1 - else: - pass - kernel = np.ones((5, 5), np.uint8) - - # img_path = cv2.erode(img_path,kernel,iterations = 3) - img_path = cv2.erode(img_path, kernel, iterations=2) - return img_path - def separate_lines_vertical_cont(img_patch, contour_text_interest, thetha, box_ind, add_boxes_coor_into_textlines): kernel = np.ones((5, 5), np.uint8) pixel = 255