ऐसा प्रश्न है। मेरे पास शब्दकोशों के साथ एक सूची है, जिसमें शब्दों के बारे में जानकारी है, जिन्हें Google API का उपयोग करके छवि से पहचाना गया था। तो मेरी सूची इस तरह दिखती है:

test_list = [
   {
      "value": "68004,",
      "location": {
         "TL": {
            "x": 351,
            "y": 0
         },
         "TR": {
            "x": 402,
            "y": 0
         },
         "BR": {
            "x": 402,
            "y": 12
         },
         "BL": {
            "x": 351,
            "y": 12
         }
      },
      "type": 1
   },
   {
      "value": "Чорномор",
      "location": {
         "TL": {
            "x": 415,
            "y": 0
         },
         "TR": {
            "x": 493,
            "y": 0
         },
         "BR": {
            "x": 493,
            "y": 12
         },
         "BL": {
            "x": 415,
            "y": 12
         }
      },
      "type": 1
   },
   {
      "value": "вулиця,",
      "location": {
         "TL": {
            "x": 495,
            "y": 14
         },
         "TR": {
            "x": 550,
            "y": 10
         },
         "BR": {
            "x": 551,
            "y": 22
         },
         "BL": {
            "x": 496,
            "y": 26
         }
      },
      "type": 1
   },
   {
      "value": "140,",
      "location": {
         "TL": {
            "x": 557,
            "y": 8
         },
         "TR": {
            "x": 576,
            "y": 7
         },
         "BR": {
            "x": 577,
            "y": 20
         },
         "BL": {
            "x": 558,
            "y": 21
         }
      },
      "type": 1
   },
   {
      "value": "кв.",
      "location": {
         "TL": {
            "x": 581,
            "y": 6
         },
         "TR": {
            "x": 605,
            "y": 4
         },
         "BR": {
            "x": 606,
            "y": 21
         },
         "BL": {
            "x": 582,
            "y": 23
         }
      },
      "type": 1
   },
   {
      "value": "77",
      "location": {
         "TL": {
            "x": 607,
            "y": 5
         },
         "TR": {
            "x": 628,
            "y": 4
         },
         "BR": {
            "x": 629,
            "y": 19
         },
         "BL": {
            "x": 608,
            "y": 21
         }
      },
      "type": 1
   },
]

तो मैं खोजना चाहता हूं, यदि कुछ शब्दकोशों में समान स्थान पैरामीटर हैं और यदि यह सत्य है, तो इन शब्दकोशों में समान अनुक्रमणिका के साथ एक नई कुंजी "string_number" जोड़ें। उदाहरण के लिए उपरोक्त कोड में दो पहले शब्दकोशों में समान ["स्थान"] ["टीएल"] ["y"] और ["स्थान"] ["TR"] ["y"] == 0px, और [ "स्थान"] ["बीआर"] ["वाई"] और ["स्थान"] ["बीएल"] ["वाई"] == 12px। तो इसका मतलब है कि इन शब्दों को एक वास्तविक दस्तावेज़ में एक स्ट्रिंग में रखा गया है, इसलिए मैं उन्हें इंडेक्स 0 के साथ नई कुंजी "string_number" जोड़ना चाहता हूं। यह इस तरह दिखेगा:

test_list = [
   {
      "value": "68004,",
      "location": {
         "TL": {
            "x": 351,
            "y": 0
         },
         "TR": {
            "x": 402,
            "y": 0
         },
         "BR": {
            "x": 402,
            "y": 12
         },
         "BL": {
            "x": 351,
            "y": 12
         }
      },
      "type": 1
      "string_number": 0
   },
   {
      "value": "Чорномор",
      "location": {
         "TL": {
            "x": 415,
            "y": 0
         },
         "TR": {
            "x": 493,
            "y": 0
         },
         "BR": {
            "x": 493,
            "y": 12
         },
         "BL": {
            "x": 415,
            "y": 12
         }
      },
      "type": 1
      "string_number": 0
   },

फिर बाकी की सूची से गुजरते हुए मैं इस तरह के हर दोहराव को खोजना चाहता हूं और उनके लिए एक ही स्ट्रिंग इंडेक्स सेट करना चाहता हूं। हालांकि, कभी-कभी पिक्सेल 1-2 अंक कम या अधिक से भिन्न हो सकते हैं (उदाहरण के लिए "y": 12 या 10 या 14 शायद अभी भी कहते हैं कि शब्द एक दस्तावेज़ में एक ही पंक्ति पर है)। तो क्या इस अंतर के लिए अतिरिक्त जांच करना वास्तविक है?

संपादित करें: इसलिए मैंने अलेक्सा स्वित्लिका की मदद का उपयोग किया और एक वर्ग बनाया, जो एक ही पंक्ति पर शब्दों की खोज के बारे में सभी काम करता है। तो ऐसा लगता है:

class WordParser():
    def __init__(self):
        self.list_wbw = self.load_json()
        self.next_new_string_number = 0

    def load_json(self):
        with io.open(calc_paths(status="now", path_type=PathType.OCR_JSON_WBW), 'r', encoding='utf-8') as content:
            self.list_wbw = json.load(content)
        content.close()
        return self.list_wbw

    def mark_images_on_same_line(self):
        number_of_images = len(self.list_wbw)
        for i in range(number_of_images):
            for j in range(i + 1, number_of_images):
                image1 = self.list_wbw[i]
                image2 = self.list_wbw[j]
                on_same_line = self._check_if_images_on_same_line(image1, image2)

                if on_same_line:
                    self._add_string_number_to_images(image1, image2)

    def print_images(self):
        print(json.dumps(self.list_wbw, indent=3, sort_keys=False, ensure_ascii=False))

    def _check_if_images_on_same_line(self, image1, image2):
        image1_top_left = image1["location"]["TL"]["y"]
        image1_top_right = image1["location"]["TR"]["y"]
        image1_bot_left = image1["location"]["BL"]["y"]
        image1_bot_right = image1["location"]["BR"]["y"]

        image2_top_left = image2["location"]["TL"]["y"]
        image2_top_right = image2["location"]["TR"]["y"]
        image2_bot_left = image2["location"]["BL"]["y"]
        image2_bot_right = image2["location"]["BR"]["y"]

        same_top_left_position = self._pixel_heights_match_within_threshold(image1_top_left, image2_top_left)
        same_top_right_position = self._pixel_heights_match_within_threshold(image1_top_right, image2_top_right)
        same_bot_left_position = self._pixel_heights_match_within_threshold(image1_bot_left, image2_bot_left)
        same_bot_right_position = self._pixel_heights_match_within_threshold(image1_bot_right, image2_bot_right)

        if same_top_left_position and same_top_right_position and same_bot_left_position and same_bot_right_position:
            self._add_string_number_to_images(image1, image2)

    def _add_string_number_to_images(self, image1, image2):
        string_number = self._determine_string_number(image1, image2)
        image1["string_number"] = string_number
        image2["string_number"] = string_number

    def _determine_string_number(self, image1, image2):
        string_number = self.next_new_string_number

        image1_number = image1.get("string_number")
        image2_number = image2.get("string_number")

        if image1_number is not None:
            string_number = image1_number
        elif image2_number is not None:
            string_number = image2_number
        else:
            self.next_new_string_number += 1

        return string_number

    def _pixel_heights_match_within_threshold(self, height1, height2, threshold=4):
        return abs(height1 - height2) <= threshold

और मेरे दूसरे मॉड्यूल में, जहां मैं इन विधियों को कॉल करता हूं:

    word_parser = WordParser()
    word_parser.mark_images_on_same_line()
    word_parser.print_images()
1
Slobjo 12 जिंदा 2021, 17:49

1 उत्तर

सबसे बढ़िया उत्तर

आपके test_list के बाद निम्नलिखित कोड जोड़ना मुझे वह आउटपुट मिला जो आप नीचे देख सकते हैं। मेरा कोड वर्तमान में सिर्फ यह जांचता है कि टीआर और टीएल की ऊंचाई एक सीमा के भीतर है (2 पिक्सेल थ्रेशोल्ड के लिए डिफ़ॉल्ट)। लेकिन आप इसे अपनी आवश्यकताओं के आधार पर संशोधित कर सकते हैं। _check_if_images_on_same_line में आप जैसे चाहें नियम बदल सकते हैं।

import json

#-------------------------------------------------------------------
#---Classes---------------------------------------------------------
#-------------------------------------------------------------------
class ImageParser():
    def __init__(self, list_of_images):
        self.list_of_images = list_of_images
        self.next_new_string_number = 0

    # ----------------------------------------------------------------------------
    # ---Public-------------------------------------------------------------------
    # ----------------------------------------------------------------------------

    def mark_images_on_same_line(self):
        number_of_images = len(self.list_of_images)
        for i in range(number_of_images):
            for j in range(i+1, number_of_images):
                image1 = self.list_of_images[i]
                image2 = self.list_of_images[j]
                on_same_line = self._check_if_images_on_same_line(image1, image2)

                if on_same_line:
                    self._add_string_number_to_images(image1, image2)

    def print_images(self):
        print(json.dumps(self.list_of_images, indent=True, sort_keys=False, ensure_ascii=False))

    # ----------------------------------------------------------------------------
    # ---Private------------------------------------------------------------------
    # ----------------------------------------------------------------------------
    def _check_if_images_on_same_line(self, image1, image2):
        image1_top = image1["location"]["TL"]["y"]
        image1_bot = image1["location"]["BL"]["y"]

        image2_top = image2["location"]["TL"]["y"]
        image2_bot = image2["location"]["BL"]["y"]

        same_top_position = self._pixel_heights_match_within_threshold(image1_top, image2_top)
        same_bot_position = self._pixel_heights_match_within_threshold(image1_bot, image2_bot)

        if same_bot_position & same_top_position:
            self._add_string_number_to_images(image1, image2)

    def _add_string_number_to_images(self, image1, image2):
        string_number = self._determine_string_number(image1, image2)
        image1["string_number"] = string_number
        image2["string_number"] = string_number

    def _determine_string_number(self, image1, image2):
        string_number = self.next_new_string_number

        image1_number = image1.get("string_number")
        image2_number = image2.get("string_number")

        if image1_number is not None:
            string_number = image1_number
        elif image2_number is not None:
            string_number = image2_number
        else:
            self.next_new_string_number += 1

        return string_number

    def _pixel_heights_match_within_threshold(self, height1, height2, threshold=2):
        return abs(height1 - height2) <= threshold


#-------------------------------------------------------------------
#---Main------------------------------------------------------------
#-------------------------------------------------------------------
if __name__ == "__main__":
    image_parser = ImageParser(test_list)
    image_parser.mark_images_on_same_line()
    image_parser.print_images()

निम्नलिखित परिणाम देता है:

[
 {
  "value": "68004,",
  "location": {
   "TL": {
    "x": 351,
    "y": 0
   },
   "TR": {
    "x": 402,
    "y": 0
   },
   "BR": {
    "x": 402,
    "y": 12
   },
   "BL": {
    "x": 351,
    "y": 12
   }
  },
  "type": 1,
  "string_number": 0
 },
 {
  "value": "Чорномор",
  "location": {
   "TL": {
    "x": 415,
    "y": 0
   },
   "TR": {
    "x": 493,
    "y": 0
   },
   "BR": {
    "x": 493,
    "y": 12
   },
   "BL": {
    "x": 415,
    "y": 12
   }
  },
  "type": 1,
  "string_number": 0
 },
 {
  "value": "вулиця,",
  "location": {
   "TL": {
    "x": 495,
    "y": 14
   },
   "TR": {
    "x": 550,
    "y": 10
   },
   "BR": {
    "x": 551,
    "y": 22
   },
   "BL": {
    "x": 496,
    "y": 26
   }
  },
  "type": 1
 },
 {
  "value": "140,",
  "location": {
   "TL": {
    "x": 557,
    "y": 8
   },
   "TR": {
    "x": 576,
    "y": 7
   },
   "BR": {
    "x": 577,
    "y": 20
   },
   "BL": {
    "x": 558,
    "y": 21
   }
  },
  "type": 1,
  "string_number": 1
 },
 {
  "value": "кв.",
  "location": {
   "TL": {
    "x": 581,
    "y": 6
   },
   "TR": {
    "x": 605,
    "y": 4
   },
   "BR": {
    "x": 606,
    "y": 21
   },
   "BL": {
    "x": 582,
    "y": 23
   }
  },
  "type": 1,
  "string_number": 1
 },
 {
  "value": "77",
  "location": {
   "TL": {
    "x": 607,
    "y": 5
   },
   "TR": {
    "x": 628,
    "y": 4
   },
   "BR": {
    "x": 629,
    "y": 19
   },
   "BL": {
    "x": 608,
    "y": 21
   }
  },
  "type": 1,
  "string_number": 1
 }
]
1
Svit 12 जिंदा 2021, 21:25
1
ठंडा! बहुत - बहुत धन्यवाद। मैं अपनी पोस्ट संपादित करूंगा और कोड का नया हिस्सा जोड़ूंगा। मैंने सभी कोनों (टीएल, टीआर, बीएल, बीआर) के साथ तुलना करने के लिए कुछ गहराई से किया है ताकि अधिक ठीक से जांच की जा सके
 – 
Slobjo
13 जिंदा 2021, 13:02